数据类型扩展:
定义的数据类型的值与定义的数据类型无关,只与最后输出形式有关。
如:char c=128;printf("c=%u",c),c=4294967168(0xFFFFFF80); printf("c=%d",c),输出为c=-128;
char c=64;printf("c=%u",c),c=64(0x00000040); printf("c=%d",c),输出为c=64;
unsigned short i=10;printf("~i=%u",~i)~i=4294967285(0xFFFFFFF5); printf("~i=%d",~i),~i=-11;
其中涉及到数据类型的扩展,符号扩展规律就是“对于无符号整型数据,要扩展成符号位的话,就是将扩展位补零,其他位保持不变。但对于有符号整型数据的符号扩展规律就是:原来符号位为1时,符号扩展位补1;原来符号位为0时,符号扩展位补0;其他位保持不变。”
定义为字符型时,先扩展为int型:char型扩展属于有符号扩展,c=128=0x80,最高位也就是符号位为1,扩展成int型后c=0xFFFFFF80;c=64=0x40,符号位为0,扩展成int型后c=0x00000040;这里就是原来符号位为1时,符号扩展位补1;原来符号位为0时,符号扩展位补0;其他位保持不变
在计算机中采用补码保存数据,若为无符号输出或最高位为0(正数),原码与补码相同,若为有符号输出,看最高位,若为1,表示为负数,求取原码,c的原码=补码按位取反(除符号位外)+1(注:原码-补码之间的相互转换规则相同)=0x80000080;所以输出为-128;
定义为无符号短整型时,先扩展为int型:i=10=0x0A,扩展成int型,符号扩展位为0,扩展后i=0x0000000A;~i=0xFFFFFFF5;原码=0x8000000B==-11;