王鹏飞

Blog

Tutorial

About

开发者笔记

2022年2月17日

计算机是如何存储整数的——原码、反码、补码

在之前的文章介绍了计算机是如何存储浮点数的,本节内容在介绍下计算机是如何存储整数的。

首先了解下原码、反码和补码的概念。

原码、反码和补码

原码、反码和补码都是数值的一种二进制表现形式。

  1. 原码

原码第一位为符号位,其余为数值位,如果用8位二进制的原码表示十进制的 1 和 -1。

十进制 原码
+1 0000 0001
-1 1000 0001
  1. 反码

正数和负数的反码表示方法,有所区别。

  • 正数:正数的反码与原码相同
  • 负数:负数的原码在原码的基础上,保持符号位不变,其余各位按位取反
十进制 原码 反码
+1 0000 0001 0000 0001
-1 1000 0001 1111 1110
  1. 补码

正数和负数的补码形式表现也有所不同。

  • 正数:正数的反码与原码相同
  • 负数:负数的补码,在其反码的基础上加 1
十进制 原码 反码 补码
+1 0000 0001 0000 0001 0000 0001
-1 1000 0001 1111 1110 1111 1111

正数的原码、补码和反码完全一致,而负数原码、补码和反码完全不同,所以在计算负数的二进制机器数时,要十分小心。

整数的存储形式

计算机底层实际存储的是整数的补码,实际过程大概如下:

1)输入 -1;

2)转换为原码 1000 0001

3)转换为反码 1111 1110

4)转换为补码 1111 1111;

5) 将补码存储到内存中。

所以在得到一个整数的机器数时,想要获得它表示的真实数值,不能直接将其转换为十进制,应该首先将其转换为反码,在转换为原码,最后将得到的原码转换为十进制数值(注意得到的原码第一位是符号位,不要转换错误)。

举个例子,补码为 1111 1001,求十进制数。

1)转换为反码,补码减一得到反码 1111 1000

2)转换为原码,符号位不变,其余位按位取反得到原码 1000 0111

3)将原码转换为十进制数,符号位为 1,所以结果为 -7

所以 -7 就是计算机存储的 1111 1001 表示的真实值。

注意:如果采用 8 位二进制存储整数,那么补码 1000 0000 表示的 -128,计算机中一个8位的二进制数的存储范围是用补码表示的 [-128,127],而不是用原码或反码表示的 [-127,127]。所以计算机中一个字节的取值范围是 [-128,127]

(完)

留言(0


发表评论

邮箱地址不会被公开。*表示必填项