无符号与有符号类型转换和值为负数情况

1. 我们知道,当一个整型变量为有符号时,一般不管是赋正数还是负数,只要赋的值不超过该变量类型所表示的范围,值是不会变的。
2. 但当给无符号整形变量赋予负数值时,该变量会发生180度的变化。比如给一个无符号的char型变量a赋予-1时,该变量实际上值会变成255。给一个无符号的int型变量b赋予-1时,该变量实际上值会变成4294967295。
  这种现象平常会发生在隐式转换中,比如在下面两个题中,判断一下那个会进入循环体:
在这里插入图片描述
  如果平常不注意的话,会认为1,2都不会进入循环体,但实际上2是能进的,也就是说在的程序段中index-1的值是等于4294967295,也就是0xFFFFFFFF。
  隐式类型转换造成了这个问题,在计算机中,数都是以补码的形式存放的,正数的补码是其原码本身,负数的补码是原码除符号位外求反加1。index-1是以index+(-1)形式去运算的,就是先把减数和被减数转换成补码,然后再相加,index为无符号长整型,(-1)为有符号整型。长整型和整型都是32位的(在32位机中),根据自动类型转换的规格,范围小的类型会转换成范围更大的类型(无符号长整型表示的范围比有符号整型表示的范围的范围大,无符号最高位用来表示值得原因)。所以在程序2中,-1在内存中的补码为0xFFFFFFFF,但类型转换成无符号长整型时,计算是将他以补码的形式输出(因为不考虑有符号的影响,所以这个值输出时就不需要在将补码转换为原来的原码),所以index-1是等于index+(unsigned long int)(-1)等于0+4294967295。
  然后在第一个程序中,unsigned short类型为16位,比int型表示的范围低,所以unsiged short会转变成有符号int型,index-1的结果还是-1,所以不能执行循环体。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值