这两天在练习C语言基础编程的时候遇到了一道关于编写函数比较两个整数的大小的问题,看似挺简单的,后来查了不少资料发现,还是有些细节问题需要研究的。
总结:
1,因为异号相减容易溢出,确保两数是同号后可以用减法。
2,负整数右移(sizeof(int)*8 -1 )后,得到的是-1而不是1,因为负整数右移是
算数右移SAR;
3,注意移位运算的优先级要比加减法低。
4,不要直接使用31,因为有些系统的int不是32位的。
5,在计算机中,由于机器码的位数通常是给定的,因此计算机中数的表示范围(允许
取值范围)是有限的。若两数进行加减运算的结果超出给定的取值范围就称为溢出。当计算过程
中出现溢出时,必须及时处理。定点机如出现溢出,则要停止运算,进行中断处理。
6,为了判断“溢出”是否发生,可采用两种检测方法:
单符号位操作检测方法。这种判断溢出的方法是当操作数中的加数与被加数符号相同
时,若运算结果的符号与操作数的符号不一致,则表示溢出;否则,表示没有溢出。而当加数
和被加数符号不同时,相加运算的结果是绝对不会溢出的。
下面是检测下负整数右移后,得到的是-1而不是1
(-5)原码:100····0101
反码:111····1010
补码:111····1011 (-4)
负数右移1位:
补码 :111····1101
补码-1取反: 10000···0011(-3)
-5右移31位:
111····1011(补码)
移位后:111····1111(补码)
-1:111·····1110 (反码)
二进制数:10000····0001 (-1)
-4 原码:1····0100
反码:111···1011
补码:111···1110
-4右移31位:1111····1111
1111····1110
1000····0001 (-1)