类型转化的若干问题

问题一:自动转换

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,就作为负数处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值