深入了解整数在计算机内部的表示

本文探讨了无符号整数和有符号整数的表示方式,特别是聚焦于补码表示法。详细解释了为何在计算机系统中选择补码来表示有符号整数,并通过例子展示了补码运算的原理。
摘要由CSDN通过智能技术生成

1. 无符号整数的表示

    我们知道,无符号整数在计算机内部是以二进制的形式存储的,比如我们在C语言中声明并初始化一个变量:
int i = 66;
    假设我们针对的机器是32位机器,byte order为little endian。由于int类型是32位的,66这个数字就会被存储为它的32位二进制表示(01000010 00000000 00000000 00000000),共占据4个存储单元。
    这样一来,32位二进制数所能表示的无符号整数共有2^32个,范围为[0, 2^32 - 1]。然而,我们需要计算机计算的内容常常会包含负整数,所以先得使得计算机能够“认识”负整数。这就要求我们制定一种规则,对于给定的32位二进制数,这种规则要能够准确的说明它表示的是负整数还是正整数,并进一步说明值是多少。在这种需求下,人们首先发明了原码这种能同时表示正整数和负整数的编码规则。原码的规则很简单,拿32位二进制数来说,把它的最高有效位(most significant bit,msb)规定为符号位,1的话这个数就是个负数,0的话这个数就是个正数,其余的31位来表示这个数的值是多少。也就是说原码把32位拆成了1位的符号位和31位的数值位序列。
    然而原码存在两个问题,一是数值0的表示有两种:一种是msb为1其余位为0(-0),一种是msb为0,其余位为1(0);还有一个更头疼的问题是互为相反数的两个数(除了0)相加不等于0...于是人们又发明了反码。反码也是msb作为符号位,然后其余的31位,将一个数的低31位按位取反,即可得到它对应的相反数。在反码这个编码体系下,两个互为相反数的数相加倒是等于0了,不过数值0依旧有两种形式,一个32位全为0的+0,一个是32位全为1的-0。
    我们不仅仅想让数值0只有一种二进制表示,而且我们还想让有符号数和无符号数能使用同一套加法器及乘法器。基于这些需求,补码便诞生了。

2. 补码表示

    在补码表示中,是将32位二进制数能表示整数的范围劈成两半,一半给负整数,一半给非负整数。那么很自然的划分成一半一半的方法就是根据msb为0或1来划分。补码表示下,msb为1表示这个数是负整数,为0表示是非负整数。 

(1)有符号整数与无符号整数

    我们先来理清一下无符号整数和有符号整数的概念。首先,我们要知道的是,计算机压根就不认识有符号和无符号,对于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值