问题一:自动转换
unsigned long var = 3941661354;
printf ("%d ",var ); -353305942
printf("%u",var); 3941661354
以上两个结果用有符号相加正好得 3941661354 + 353305942 = 4294967296
gdb 下的二进制为 1110 1010 1111 0000 1111 1010 1010 1010
%d 的二进制为 0001 0101 0000 1111 0000 0101 0101 0110
以上各位相加 1000 0000 0000 0000 0000 0000 0000 00000
对于上面的例子,长整型最高位被当作符号位,其他位取反加1得到353305942,这样的结果正好比全1 多了 1 ,故得到4294967296
结论:对于长度相同的类型转换,位数没有截断,只是对二进制的解释不同了(扩展 -1的二进制表示:)
上题如果改为:
long var = -353305942;
printf ("%d ",var ); -353305942
printf("%u",var); 3941661354
问题二: 再把上述代码改为如下的:
short var = -353;
printf("%d",var); -353
printf ("%u \n ",var ); 4294966943
输出结果与代码相同。
二进制表示为1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110 1001 1111
有符号位提升到高位时 前面补符号位 (取反加1后与原来的值相同)
问题三:研究有符号无符号 char 型的转换
char var = 353;
printf ("%u \n ",var ); 97
printf("%d",var); 97
353二进制1 0110 0001
97 二进制 0110 0001
这是因为353超过了一个char 的范围,存的时候舍弃的高位。
问题四:
char var = -53;
printf ("%u \n ",var ); -5
printf("%d",var); 4294967243
如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算
问题五:
char var = 221;
printf ("%d \n ",var ); -35
printf("%u",var); 4294967261
221二进制表示为11011101
char 赋值给int 的时候:一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。