char a = 300;
printf(“%d\n”,a);
结果是44
思路:默认char类型是有符号类型,数值范围是-128 – 127
转化为带符号二进制的话
[+300]原=0 1 0010 1100//正数原码符号为0,负数为1
[+300]补=0 1 0010 1100
溢出后丢掉高两位,补码变为
0010 1100 (44)
char b=400;
printf(“%d\n”,b);
b=-112
分析:
+400原=01 1001 0000
+400补=01 1001 0000
溢出后
+400补=1001 0000
+400反=1001 0000-1=1000 1111
转变为原码后:1 111 0000
十进制为-112
总结
先得到补码-》 补码-1 -》反码 -》原码 -》十进制
#include <stdio.h>
int main()
{
unsigned char a = 300;
unsigned char b=400;
printf("a= %d\n",a);
printf("b= %d\n",b);
}
结果:
[csy@local char_full]$ ./char
a= 44
b= 144
分析:
300
[+300]原= 1 0010 1100
[+300]补= 1 0010 1100
溢出后丢掉高位,补码变为
0010 1100 (44)
400:
+400原=01 1001 0000
+400补=01 1001 0000
溢出后丢掉高位,补码变为
1001 0000 (128+16=144)