C语言面试常见题型:char类型溢出

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)

发布了65 篇原创文章 · 获赞 36 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40860986/article/details/94409174