一般情况下找到合适的例子能够非常有助于我们理解问题
其实本来想在他问题下面回复的,但是帖子太久远~ 已经不支持了回复功能- -!!哈哈。
一、这个是关于不同数据类型打印值不同的问题
int main(void)
{
unsigned char a = -1;
unsigned short b = -1;
unsigned int c =-1;
printf("a = %d\n", a);//255
printf("b = %d\n", b);//65535
printf("c = %d\n", c);//-1
return 0;
}
那这里为什么a和b打印的都是整型值,而c是-1呢。
首先,理解这个问题要深入理解一个概念
%d的打印形式是32位有符号整形
举个例子吧,比如你的系统是32位的,那么int型可以支持0xFFFFFFFF这么大的数,但是%d能打印出来的整数就是在4294967295/2 也就是正整数的2,147,483,647~负整数2,147,483,647之间。所以当你打印c = -1时,也就是最大值4 294 967 295不会正常显示正整数,会显示-1,因为溢出了。经过试验得出使用%d打印4 294 967 295-1 得出的值会是-2哦,而a和b是整形值是因为%d是打印 [00000000 00000000 00000000 00000000] 32位,而前面a和b一个是1字节一个是2字节,没有超过%d能打印的正整数,所以-1最后通过%d 32位的转换变成了
a = 00000000 00000000 00000000 11111111
b = 00000000 00000000 111111111 11111111