一、复习原码、反码、补码、移码
原码、反码、补码、移码全是有符号数。
以下全是4位的情况
原码:0的表示有两种,取值范围是[-7,7]
反码:0的表示有两种,取值范围是[-7,7]
补码:0的表示为0000,取值范围是[-8,7],-8的表示为1000
二进制的表示顺序1000,1001,1010,......,0000,0001,0010,......,0111
移码:0的表示为1000,取值范围是[-8,7],-8的表示为0000
二进制的表示顺序0000,0001,0010,......,1000,1001,1010,......,1111
正数:原码=反码=补码
负数:
原码—>补码:除符号位,其余位全部取反,末位加1
补码—>原码:除符号位,其余位全部取反,末位加1
x的补码—>-x的补码:包括符号位全部取反,末位加1
二、位数扩展
有符号数和无符号数的转换:二进制数相同,只是解释不同。例如:1001。无符号数的解释为9,有符号数的解释为-1.
长字长到短字长:高位截断。例如16位数到8位数,9-16的位数全部截断
短字长到长字长:扩展高位,如果是有符号数且是负数,高位补1.如果有符号数且是正数,高位补0。如果是无符号数,高位补0.
例1:16位补码0x8FA0扩展为32位应该是( )
答案:0xFFFF 8FA0
解析:8FA0=1000 1111 1010 0000.因为是补码(有符号数),这是一个负数,从16位转到32位,前面补1,变成1111 1111 1111 1111 1000 1111 1010 0000,化为十六进制,0xFFFF 8FA0
例2:执行下列语句:unsigned short x=65530; unsigned int y=x;,则y的机器数是( )
答案:0000FFFAH
解析:因为x,y都是unsigned,所以x,y都是无符号数;又因为y=x,x是short,y是int,所以是从short型转为int型,也就是从16位转到32位。因为2的16次方-1(FFFFH)是65535,所以65530是FFFAH。前面再补16个0,也就是0000 FFFAH.