深入理解计算机系统_信息的表示与处理

1.对于无符号与有符号之间的强制类型转化,低层的位表示不变。

2.C语言在执行运算的时候,如果他的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式的将有符号参数强制转化为无符号参数,然后再执行运算。
例如2147483647 > -2147483647-1
但是,2147483647U < -2147483647-1 (注意,2^31=2147483648)
因为,第二个运算涉及有符号与无符号的运算,C语言会隐式的将有符号参数强制转化为无符号参数,故-2147483647-1=-2147483648,位表示为10000…..0000,在无符号数里面,即为2147483648,所以才会有2147483647U < -2147483647-1 这样的错误产生。

3.将一个较小的数据类型转化为一个较大的数据类型。
对于无符号数,只需开头补零。
对于有符号数,只需开头补最高位。
例如,原始值为11001000,转化到最高位就是1111111111001000,即在前面补最高位(这里原始值的最高位为1)。
解释:补出的位数与原始值的最高位合计起来,其值刚好不影响结果。
再比如,

1
2
short sx = -12345;
unsigned int sy = sx;

那么sy的结果是多少呢?
分析:short型的是2位,unsigned int 是4位。
12345 = ox3039 = 0011000000111001,取反加一得-12345的存储值:1100111111000111 = oxcfc7
按最高位补开头,
sy = 1111111111111111 1100111111000111 = 4294954951