C++中负数的二进制表示(内存中的存储形式)

首先,我们看一下这个数轴,8位二进制表示数值型数据,它应该是落在0~256(不含 256)区间上,当这个数落在0~128(不含128)区间上时,我们说它是一个正数,至于正多少取决于这个数从0点往右走了多少。 如:+33对应的二进制是00010001   如果这个数落在后半轴上,也就是128~256(不含256)区间上时,我们说它是一个负数,至于负多少取决于它离终点256还差多少。如:156表示就不再是+156,而是表示-100,二进制编码为:10011100  
 稍微细心的朋友可能会发现,凡是落在后半轴的数,也就是负数,都有一个共同点,那就是这个数第1位二进制编码一定是1,而落在前半轴的数第1位一定是0,这样就造成很多人误认为1就是仅仅简单的表示负号,而0表示正号,这是不科学的。但反过来说是可以的:负数的最高位一定是1,正数的最高位一定是0   
可能有朋友会问了,156表示不是+156,那+156该怎么表示呢,它的二进制编码又是多少呢?   
在这里我要强调一下,我们现在是假设只用1个字节(也是8位二进制)来表示带符号的整数,那么它能表示的数的范围只能是          -128 ~ +127之间,156是表示不下的,明白吗。要想表示156,就不能用1个字节去表示该整数,可以用2个字节的short或者4个字节的int类型。因为1个字节的char类型能表达数值的范围只能是 -128 ~ +127之间。
若是输出这个被赋予156值的char类型的字符变量,是会直接显示出一个负数,不需要进行最高字符位是否为1的判断。
 
好的,到这里相信各位基本了解了负数的表示原理了,在这里我还想沟通一下求负数表示的另外一种方法,这就是很多书上提到的采用补码的方法 (负数的绝对值的二进制位按位取反,再加1)  
要求一个负数的二进制表示方式,可以先求出它的原码(即负数的绝对值的二进制位),然后每位取反得出它的反码,反码再加1得出补码  
如:
假设还是以8位二进制来表示带符号的整数(如果是short类型,int类型等,他们都有自己的数值范围)   
-56的原码是:00111000   那么它的反码是:11000111    补码为:11000111+1=11001000   
得出,-56在计算机内部是用11001000这串二进制来表示的

猜你喜欢

转载自blog.csdn.net/jirryzhang/article/details/79166684
今日推荐