前面转自别人的博客,为了防止自己忘记,同时也在后面添加了一些自己的理解,原文地址:https://blog.csdn.net/findsafety/article/details/80539536,侵删。
初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。
首先说吧,32767很容易理解,32767=2^15-1 (因为要有一个符号位),但为什么下溢的时候分明是15位来表示的数会出现32768呢??
首先从原码讲起,原码即为计算机中对数值的二进制表示,如 5用二进制表示为0000 0101 ;
其次就是反码,反码,顾名思义取反,对于正数来说,反码与原码相同;对于负数来说,反码为原码的各位取反(符号位除外),如(0011 0111)反= 0011 0111 (1101 0010)反= 1010 1101 ;
再次就是补码,计算机中,数值疑虑用补码表示和存储的,正数的补码与原码相同,负数的补码为其反码+1,如(0101 1101)补=0101 1101 (1101 0010)补=1010 1110
由于计算中的CPU只有加法器,没有减法器,所以在计算机采用原码做减法是会存