1、数学中可以用∞表示无限大,但是在计算机具体实现中却只能把这种抽象具体化,比如用100位二进制表示一个数;100位二进制也仅能2^100个数,不过这对我们来说已经是天文字了,我们可以把2^100-1看成是无限大了~
2、对于任何一个特定的类型在特定的系统下都对应一个固定的字节数,下面假定char占用1个字节。对于unsigned char i,while(1){i++}会一直增大,直到最大1111 1111,继续加1变成1 0000 0000,这个数在数学上是没问题的,多大的数都能表示,但是计算机只用8bit表示char,所以多出的1只能被丢弃,也就是发生了上溢,结果变成了0 ;对于signed char j, while(1){j++}也会一直增大,因为最高位表示符号位,所以增加到0111 1111时达到最大值 ,继续加1变成1000 0000,变成最小的负数(一下子从天上掉到了地狱里:P), 然后又慢慢变大,直到最大的负数1111 1111;
3、顺时针方向数据一直增大直到溢出,对无符号数来说,这个过程是线性稳定增长的;对有符号来说是两次线性增长的组合 ,中间会发生一次巨变(最大的正数->最小的负数);
4、如果1xxx xxxx
和0yyy yyyy
关于竖线对称,则顺时针移动1xxx xxxx
个单位等同于逆时针移动0yyy yyyy
个单位;补码的思想就是把减法转换成加法,即把逆时针移动0yyy yyyy个单位
转换成顺时针移动1xxx xxxx个单位
,因此也就把1xxx xxxx
定义成了负0yyy yyyy
的补码,这样可以简化计算机设计。又因为1xxx xxxx + 0yyy yyyy = 2^8
, 所以求补码的运算就变得异常简单:
-3(补)=2^8 - 3 = 1111 1111 - 0000 0011 = 1111 1100
-126(补)=2^8 - 126 = 1111 1111 - 0111 1101 = 1000 0010