赞
踩
首先,计算机中为什么要有补码?
答案是使符号位参加运算,从而简化加减法的规则,使减法运算转成加法运算,从而简化机器的运算器。计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,在一字节中,最小的负值是1000 0000,也就是-128。
正数: 最高有效位为0表示符号为正,数的其余部分则表示数的绝对值
负数: 用一个简单的方法来表示负数负数相对应的正数,用补码表示,按位取反,最后在末位(最低位)加1
用补码表示数时的符号扩展问题。比如从8位扩展到16位,从16位扩展到32位
正数的扩展应该在前面补0,而负数的扩展则应该在前面补1(不管是扩成有符号的还是无符号的)
下面再看两个程序:
1、
int main()
{
int i;
char c;
c = (char)128;
i = c;
printf("%d,%u", i, i);
getchar();
}
结果是 -128,4294967168
c= 0x80 = 1000 0000
i= 0xFFFF FF80
2、
int main()
{
unsigned int i;
char c;
c = -1;
i = (unsigned)c;
printf("%d,%u", i, i);
getchar();
}
结果是 -1,4294967295
c = 0xFF = 1111 1111
i= 0xFFFF FFFF(转成无符号的,也是在前面补1)
3、
int main()
{
int i;
char c;
c = -1;
i = (unsigned char)c;
printf("%d,%u", i, i);
getchar();
}
结果是255,255
c = 0xFF
i=0xFF
————————————————
补:当数值增加或减少到溢出时,下一个数是另一头那个数,比如,有符号char的127再加1,则值变成了-128,-128再减1则变成127。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。