C++中负数的二进制表示(内存中的存储形式)
2018-01-25 21:07
267 查看
首先,我们看一下这个数轴,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这串二进制来表示的
稍微细心的朋友可能会发现,凡是落在后半轴的数,也就是负数,都有一个共同点,那就是这个数第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这串二进制来表示的
相关文章推荐
- 输出内存中存储的二进制表示形式
- 以二进制方式输出数字在内存中的存储形式
- C++负数的二进制表示的计算
- 数据在内存中始终是以二进制形式存放的。数值是以补码表示的
- 数据在内存中始终是以二进制形式存放的,数值是以补码表示的
- C++float数据在内存中的表示形式
- 输入一个int型数据,计算出该int型数据在内存中存储时1的个数以及相应二进制表示
- 以二进制方式输出数字在内存中的存储形式
- 获得一个数据在内存中存储的二进制形式
- [C/C++]_[输出内存数据的二进制和十六进制的字符串表示]
- [C/C++]_[输出内存数据的二进制和十六进制的字符串表示]
- java和C++内存分配及数据存储
- C++内存模型与名称空间(存储持续性、作用域、链接性、动态内存分配、命名空间)
- 有符号数在内存中是以其补码的形式存在的【如何求一个负数的补码】
- 基础知识--负数的二进制表示方法
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- C/C++二进制,八进制, 十进制和十六进制的表示方法
- 7.14 将例7.13以二进制形式存放在磁盘文件中的数据读入内存,并在显示器上显示。
- C/C++内存存储 mark在此