博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++负数的二进制表示的计算
阅读量:4165 次
发布时间:2019-05-26

本文共 970 字,大约阅读时间需要 3 分钟。

 首先,我们看一下这个数轴,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这串二进制来表示的

转载地址:http://uzlxi.baihongyu.com/

你可能感兴趣的文章
plsql developer如何在窗口列表直接可以修改表格中的数据?
查看>>
java自定义注解有什么作用?
查看>>
ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
查看>>
js的Object对象如何访问中间有 . 点号的属性(键),获得其值?
查看>>
@ManyToOne和@OneToMany 注解
查看>>
Java集合(1) - List集合源码解析
查看>>
Java集合(2) - Map与AbstractMap源码解析
查看>>
Java集合(3) - HashMap源码解析与常见问题(一)
查看>>
Java集合(4) - HashMap-put()源码解析与常见问题(二)
查看>>
Java集合(5) - HashMap查删源码解析与常见问题(三)
查看>>
Java集合(6) - LinkedHashMap源码解析
查看>>
Java集合(7) - TreeMap源码解析
查看>>
Java集合(8) - Set与AbstractSet源码解析
查看>>
Java多线程(2) - 多线程之线程安全详解(synchronized、Lock)
查看>>
OKR与CFR管理模式(二)-CFR与OKR的绩效管理
查看>>
Java多线程(3) - 多线程之死锁
查看>>
Java多线程(4) - 多线程之Volatile关键字、ThreadLocal、Atomic系列类、CAS
查看>>
Java多线程(5) - 多线程之线程通讯(一)(wait、notify、join、yield、sleep区别与应用)
查看>>
Java多线程(6) - 多线程之线程通讯(二)(wait与notify案例、守护线程)
查看>>
什么是项目管理?怎么管?(二)
查看>>