问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

理解和熟悉正整数和负整数的底层存储格式和运算

创作时间:
作者:
@小白创作中心

理解和熟悉正整数和负整数的底层存储格式和运算

引用
CSDN
1.
https://blog.csdn.net/tpc4289/article/details/144564915

随着技术发展,越来越多的程序设计语言开发出来供广大程序员进行使用,程序员开发过程中,也不用去思考自己代码中的数值是怎样存储在内存中。但也正是因为太多的拿来即用的思想,导致很多人只知其一,而不知其二。今天我们从C语言角度,去理解和熟悉程序中整数的底层具体存储格式及其运算。

一、概述

计算机中,底层存储的所有的数据都是二进制数0和1,而我们生活中使用的数都是十进制数。这就涉及到一个方法,实现二进制到10进制的转换。此外,生活中我们使用的十进制整数有负整数,0和正整数,那如何用二进制来实现三种类型数据的存储也是需要办法。

二、打印数据

我们通过C语言程序,打印正整数,0和负整数二进制数据(我们用100,0,-100和-77测试)

int main() {
    t_m_bitstr(100);
    t_m_bitstr(0);
    t_m_bitstr(-100);
    t_m_bitstr(-77);
}

我本地int类型占用4字节,对应各个数二进制图为:

计算机中所有数都是二进制存储和计算的,对于int类型数值,最高bit位如果为0,代表该数值为正整数,如若为1,代表为负整数。

三、正数和负数如何区分

3.1,分析

按照常规理解,负数和整数通过最高位区分,其他bit位不需要变动。但如果真是这样做,将会出现大问题,我们以100和-100为例子:

我们100二进制为:00000000000000000000000001100100

按照上述,那么-100为:10000000000000000000000001100100

我们两者相加(100+(-100))运算,得到10000000000000000000000010001000,该结果不为0,与实际结果不符合。于是引入了原码,反码和补码的概念

3.2,原码

原码代表数值的直接二进制表示方式。正数的原码与数值相同,负数原码为数值的最高位置为1

3.3,反码

反码就是对二进制数所有bit位(除符号位)进行取反,1变为0,0变为1。但是正数的反码与原码一致(也就是不变),负数的反码是对原码(除符号位)进行取反。

3.4,补码

正数的补码还是与原码一致,负数补码为其反码加1。

3.5,存储格式

至此,我们了解了正数原码,反码和补码的概念。计算机存储正数的时候,可以理解为存储的其二进制原码,负数是以补码的形式存储在系统中。

3.6,数值运算

正是因为负数以补码的形式存储,我们通过ALU进行运算的时候,可以直接两者相加得到数值0,我们以100+(-100)为例子(两数相减可以理解一个数+另一个数据的相反数).

我们再看下100-77,100-77实际为100+(-77),我们得到:

使用补码方式,也实现了+0与-0的统一。按照上述规则,+0的存储二进制为:

00000000000000000000000000000000

那么-0就为其反码+1

111111111111111111111111111111111 + 1 = 00000000000000000000000000000000

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号