首页 > 后端开发 > C++ > 正文

在现代计算机中表示和操作信息 - 第 2 部分

Linda Hamilton
发布: 2024-11-22 14:18:40
原创
732 人浏览过

Representing and Manipulating Information in modern computer - Part 2

第 1 部分的链接

寻址和字节顺序

32 位机器中的 4 字节 int 将其所有 4 个字节存储在连续的字节序列中。根据机器的不同,它可以以两种方式存储,即小端和大端。不详细讨论Little endian存储一个十六进制值0x01234567的int(32位为4字节),如下所示(假设起始地址为0x100):
地址/值
0x100 67
0x101 45
0x102 23
0x103 01
类似地,大端字节序将如下所示:
地址/值
0x100 01
0x101 23
0x102 45
0x103 67
我希望您能看到顺序上的差异。 Linux 32 位、Windows、Linux 64 位遵循 Little endian,而 SunOS/SPARC 遵循 Big endian。

这很重要,因为通过网络从 Little endian 字节排序机向 Big endian 字节排序机发送消息时可能会出现问题,反之亦然。大多数程序员并不认为这是一个问题,因为网络应用程序的编写方式可以为我们进行此转换,但如果您正在编写网络应用程序,则可能需要考虑这一点。

整数算术

您可能会惊讶地发现,两个正数相加会得到负数,并且 x

让我举个例子,假设我们有一台计算机将 int 存储为 4 位,并且我们有两个 无符号 int x 和 y。

无符号整数 x = 10; // 二进制表示:1010
无符号整型 y = 15; // 二进制表示:1111
无符号整数 z = x y; // ???

z 的值为 25,对吗?对吗?

嗯,不。如果将 25 转换为其二进制表示形式,则结果为 11001,但正如我提到的,我们的计算机只能存储 4 位整数(无符号情况下的值从 0 到 15)。那么,我们的计算机将如何处理额外的 1 位呢?你是对的,它会丢弃高位(左起第一位),我们将得到 1001,它转换为 9。这与使用 16 进行模块相同,即 25 mod 16=9。计算机的这种不限于算术的行为也称为溢出。

但是为什么我在这里使用 unsigned int 呢?对于有符号整数,此加法的行为是否会有所不同?

答案:是的,但在解释结果是什么以及我们的计算机如何最终得到这个结果之前,让我们首先了解一下我们的 4 位大小整数有符号和无符号有何不同。

有符号整数

它们可以存储从-8(bin代表:1000)到7(bin代表:0111)的正负两个数字值。高阶位(左起第一位)给出有符号整数负值,其余位给出正值。因此,要获得最小的数字,我们需要将高位翻转为 1,其他位翻转为 0;要获得最大的数字,我们需要将高位翻转为 0,其他位翻转为 1。

无符号整数

它们只能存储从 0(二进制表示:0000)到 15(二进制表示:1111)的正数值。

现在,因为 x=10 和 y=15 在相加之前会溢出,所以我们将使用更小的值:
整数x = 5; // 0101
整数y=6; // 0110
int z = x y // ???

如果我们忽略带符号的考虑,二进制表示应该是 1011。正如你所看到的,高位被翻转为 1,从上面看,z 的值将是 -5(= -1*2ˆ3 2ˆ1 2ˆ0) 而不是 11。

而且,添加两个负数可能会导致结果。例如,
int x = -8 // 1000
int y = -5 // 0101
int z = x y // ???

现在 z 将为 -13,即二进制的 10011(高阶位用于负数,即 -1*2ˆ4 = -16),但我们的计算机只能存储 4 位,因此它将丢弃高阶位,变为0011,即十进制3。再次溢出。

这就是为什么 x

这就是今天的全部内容。如果这里的某些信息是错误或缺失的,请评论。谢谢。

以上是在现代计算机中表示和操作信息 - 第 2 部分的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板