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

1. 我们知道,当一个整型变量为有符号时,一般不管是赋正数还是负数,只要赋的值不超过该变量类型所表示的范围,值是不会变的。
2. 但当给无符号整形变量赋予负数值时,该变量会发生180度的变化。比如给一个无符号的char型变量a赋予-1时,该变量实际上值会变成255。给一个无符号的int型变量b赋予-1时,该变量实际上值会变成4294967295。
  这种现象平常会发生在隐式转换中,比如在下面两个题中,判断一下那个会进入循环体:
无符号与有符号类型转换和值为负数情况_第1张图片
  如果平常不注意的话,会认为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,所以不能执行循环体。

你可能感兴趣的:(C语言,>C基础)