char如何计算溢出值

来源:互联网 发布:欧洲 旅馆 网络 编辑:程序博客网 时间:2024/05/16 08:00
无符号char 类型能标示的数是:0-255

有符号char类型能标示的数是:-128-127

char c = 128;
printf("c = %x \n", c);

得到结果是:
c = ffffff80
这个如何理解 char是一个字节的,怎么变成四字节了???


128的十六进制是0x80, 也就是2^7, 二进制看起来像这样:1000 0000 ,赋值给有符号数char c,其二进制不变。
但是小于sizeof(int)的整数在使用时其实都是扩展到sizeof(int)再计算的,对于有符号数扩宽填充符号位,这里char ch=128的符号位是1,所以就是扩充了1111 1111 1111 1111 1111 1111 1000 0000,这样,打印%x时候,就是你看到的结果了。
这个扩宽是很正常的,并不会影响一个数值本身, 只是存储的字节变宽了而已。
比如char ch =1; 那么扩宽后是0x00 00 00 01,还是1.
比如short st = -1, 其十六进制原来是:0xff ff, 扩宽为int后是0xff ff ff ff,因为int是有符号数,所以实际的值是取反+1,就是- (0x00 00 00 00 + 1) = -(0x00 00 00 01), 还是-1。重新截断回short,也就是从0xff ff ff ff变为0xff ff,因为short是有符号数, 取反+1后还是-1, 始终是一致的。

0 0