【计算机原理】负数的二进制
1 有符号整数和无符号整数
有符号整数和无符号整数的区别在于怎样解释整数的最高位.
- 对于无符号整数,其最高位被C编译器解释为数据位.
- 对于有符号整数,C编译器将其最高位解释为符号位,若符号位为0,则表示正数;若符号位为1,则表示负数
另:对具有相同字节数的整型数而言,由于有符号整数的数据位比无符号整数的数据位少了1位,而且少的这一位恰好是最高位,因此有符号整数能表示的最大整数的绝对值只有最大无符号整数的一半
int范围是 -2^31 ~ 2^31
unsigned范围是 0~2^32
虽然int的最大值缩水,但其可以表示负数,int和unsigned所能表示的数据范围的大小一致,都是2的32次方。
2.原码、反码、补码
(1)原码
一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101是5的原码。
(2)反码
将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
比如称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,即后者也是前者的反码。
(3)补码
反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
3. 负数的二进制表示
负数在计算机中都是以二进制补码(Complement)形式表示和存储的
-1在计算机中如何表示:
# -1的绝对值1的原码:
00000000 00000000 00000000 00000001# 取反得反码:
11111111 11111111 11111111 11111110# +1得得补码:
11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。
4.负数二进制用补码表示的原因
对于计算机或者DSP芯片来说,符号并没有什么特殊的储存方式,其实是和数字一起储存的。
为了使得无论是无符号数还是有符号数,都可以使用同样的加法减法规则,符号数中的负数用正数的补码表示。
假设CPU的字长是16位。
我们都知道-1 + 1 =0,而0x0001表示1,那么-1用什么来表示才能使得-1 + 1 =0呢?
答案很简单:0xffff,用16进制计算一下0xffff+0x0001,结果是0x10000,即0x0000。
备注:用16比特来表达整数,最高位的1是第17位,这一位是溢出位,在运算寄存器中没有储存这一位,所以结果是低16位,也就是0x0000,也就是0。
这就是负数表示方式产生的原因。
再举个例子:-100。
100 的16进制为 0x0064,
-100 就是 0x10000 - 0x0064 = 0xff9c。
还有一种简单的转换符号的方法,就是取反加一,即补码。
原理清楚了,那为什么负数的二进制就是补码?
以 -1+1=0为例
1 的 2进制:0000 0000 0000 0001 (这里假设CPU字长为16位)
0 - 1
= 1 0000 0000 0000 0000 - 0000 0000 0000 0001 (0为17位,借一位1用来进行减操作)
= 1111 1111 1111 1111 (即1 取反加1,即补码)
所以换个角度
- 如果x表示一个正数,原码表示的是 就是x的二进制
- 取反后得反码,与原码相加后,得到的会是一个全为1的二进制,在此基础上再加1,就得到全为0的二进制。(备注:最高位溢出)
- 而取反后再加1,得到的就是补码,所以补码加原码,得到的必然是全为0的二进制数。
- 原码表示正数x,补码就表示x的负数:-x
5. 如何判断一个二进制数是否为负数
首先,看是无符号数/有符号数
如果是有符号数:开头第一位是符号位,1表示负数,0表示正数。
其次,看是如何存储在计算机中。
如果仅仅是给了一堆二进制:比如10101010,如果不说是怎么存储的?那么它是没有正负概念的。意思就是要知道10101010是原码还是补码,才能进而推断它的原始的值。
最后,看操作系统的位数。
若是8位的,1111 1111就是-1,若是16位的FFFF即是-1,若是32位的FFFF FFFF即是-1。
比如10101010在8位系统下是负数,在16和32位下就不是。
6. 涉及负数的位运算的不同之处
(1)左移(<<):
各二进位全部左移若干位,高位丢弃,低位补0
(2)右移(>>):
各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
(3)运算双方长度不同:
如果位运算双方,数据长度不同:系统会将二者按右端对其,然后进行位运算
但是需要补位,以long和int进行运算为例,规则如下
(备注:long占4个字节,int为2个字节,一个字节8位):
- 1)如果整型数据为正数,左边补16个0。
- 2)如果整型数据为负数,左边补16个1。
- 3)如果整形数据为无符号数,左边也补16个0。
参考:
https://blog.csdn.net/qq_43464088/article/details/105364596
https://blog.csdn.net/JIEJINQUANIL/article/details/51212769
https://blog.csdn.net/zzsfqiuyigui/article/details/5955645
https://jingyan.baidu.com/article/fedf0737b29e7535ad89775d.html
【计算机原理】负数的二进制相关推荐
- 计算机中负数的二进制表达方法
计算机中表达数值是用二进制编码表示的,但是正数的表示和负数是不一样的. 比如32为int整形数100的编码为00000000000000000000000001100100: 而-100的表示是什么呢 ...
- 计算机原理中的二进制除法,多字节除法--汇编实现原理
2.1长除法 长除法适用于整式除法.小数除法.多项式除法(即因式分解)等较重视计算过程和商数的除法,过程中兼用了乘法和减法. 长除法与手工计算除法方法一致. 以8592÷24为例: 从计算过程可以看出 ...
- 【计算机原理学习】二进制和十进制转换
目录 一.二进制转换为十进制 二.十进制转换为二进制 整数部分计算 小数部分计算 总结 一.二进制转换为十进制 二.十进制转换为二进制 由于整数部分和小数部分转换方式不同,需要将整数部分和小数部分分别 ...
- java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...
我们知道数字在计算机中都是以二进制表示的,数字类型有:byte,short,int,long 我给计算机一个数字,计算机首先要确定他的类型,因为不同类型占有的空间是不一样的, byte占有一个 ...
- 三进制 四进制计算机原理,基因编码为何选择了“四进制”,而不是计算机系统的“二进制”?...
计算机已经成功的证明,"二进制"是一种简洁又高效的编码方案(且与物理硬件相得益彰),它可以传递和映射任意复杂度的信息. 但基因编码,绝大部分却使用了4种碱基(DNA是ATCG,RN ...
- 计算机的工作原理是二进制原理吗,计算机是怎么通过二进制原理来工作的?
计算机是怎么通过二进制原理来工作的? 2018-09-17 https://www.toutiao.com/a6550957329762746637/ 二进制其实就是有没有,有就是1,没有就是0.通过 ...
- 计算机原理-计算机为什么采用二进制
[新的博客地址](shankusu.me) 题外话:熟悉本公众号的老朋友应该知道,本号的主要理念不是告诉你怎么做,而是告诉你为什么.大家也会发现大多数文章都是讲原理的知识,毕竟"知其然,知其 ...
- 创立二进制 计算机之父,伏羲创建的八卦图有多牛?计算机之父:二进制的原理从中发现...
伏羲所处的那个时代距今有八千年,也有的说一万年,处在旧石器的晚期,精细磨制的石器--比如说石刀.石铲.石镰.石针等等,开始出现.人们用火焚烧一片林地荒滩,在焚烧后的土地上用石刀挖出小小的浅窝,埋上种子 ...
- 计算机底层的二进制表达——正负数与二进制转换方法及代码
以下均是以64位计算机为例,故int类型是4字节,即32位二进制数. 文章目录 1 十进制数转为二进制 1.1 正数的二进制 1.2 负数的二进制 2 正负数与原码.反码.补码 2.1 原码 2.2 ...
最新文章
- xsd的unique验证
- 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC
- argmax函数_Python科学计算库numpy——统计函数
- 未来架构师的平台战略范例(2)_集装箱
- Cocos2dx---------------- TinyXml 解析 XML
- C++经典面试题(基础算法版)
- HTML5 DOM File API 转)
- 再学 GDI+[65]: 路径画刷(5) - SetGammaCorrection
- 【金三银四】TCP,UDP,Socket,Http网络编程面试题(2021最新版)
- 关于TC Games针对没有耳机接口的Type-C用户玩手游如何传音和语音
- 自编小程序,保持编程达人眼睛
- 关于SQL Server numeric数据类型介绍
- Nacos服务健康监测
- MySQL入门学习的第一节(SQL语句)
- SSE(Server-Sent Events)| 前后端demo参考
- fortran中call的用法_手写源码系列(一)——call、apply、bind
- yum不能使用了,怎么办?记下来!!!
- 淘宝开源的代码质量检测工具,真强啊~
- Matlab如何提取偶数行,得到矩阵的偶数/奇数索引 – MATLAB
- React取色器组件