gpt4 book ai didi

c - C语言中数字是如何在内部表示的

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:24 26 4
gpt4 key购买 nike

我是 C 的初学者,我有这样的陈述:

printf("%d",(1^6));

生成的答案为 7。我知道 ^ 是异或运算符。我在这里假设14 位 表示,如000160110。执行 xor 产生的结果为 0111,即 7

我的假设是否正确? C语言中数字是如何在内部表示的?

提前致谢。

最佳答案

这里有两件稍微不同的事情需要考虑。

C 语言标准规定文字 16 的类型为 int,因此异或运算将使用int 类型。

C 语言标准还规定 int 类型具有二进制表示,值位以 2 的递增次幂从最低位到最高位运行,加上一个与此处无关的符号位因为数字都是正数,加上可选的一些填充位(而且我从未使用过在 int 中有任何填充位的 C 实现)。

所以在那些术语中,你是对的:1 表示为二进制 16 表示为二进制 110 7就是111,再加上初始的0,足以组成int类型的大小。编写二进制数时,我们很少费心编写 00000000000000000000000000000001,即使我们知道它的类型是 32 位也是如此。

在大多数实现中,int 中值+符号位的数量是 32。您可能偶尔会看到 64 甚至 16。标准要求至少 16,但超过 16 就允许任何数字。

int 通常占用超过一个字节的存储空间。该标准没有说明最低有效位是占据第一个(最低寻址)字节、最后一个(最高寻址)字节还是中间的某个位置。所以它允许小端和大端表示,理论上也允许“中端”表示(我从未见过其中之一,至少 int 没有)。 Endian-ness 与 int 在内存中的表示有关,但它与按位运算(包括 XOR)无关,后者是根据位的重要性顺序定义的,而不是根据它们的顺序定义的内存中的顺序。

标准中都写了这些,但标准还说它只描述了“抽象机器”的行为。您的编译器实际 的结果需要与标准所说的结果相同,但是对于任何给定的代码片段,您都不需要在程序运行时在内存中看到这些精确表示。编译器为您的行发出与 printf("7"); 甚至 fputc('7', stdout);< 发出的代码相同的代码是完全合法的,如果需要的话。因此,发出的代码中可能没有任何 1 的表示。

也许它只会优化到 printf("%d", 7);,如果 printf 是库的一部分而编译器没有费心去预测 "%d" 对那个库意味着什么。也许它会在运行时进行计算,但是表示 1 它认为对 objective-c PU 来说最紧凑和/或最有效,只要编译器首先证明它自己满意不同的大小将产生相同的结果。例如,某些指令集允许所谓的“立即值”,即作为指令的一部分存储的小整数。 1 的表示仍然是一定数量的 0,最后是 1,但是因为立即数必须适合指令,所以它们通常比 int 小。

这类事情的具体细节取决于您的编译器、目标体系结构、优化级别以及可能的其他编译器选项。

关于c - C语言中数字是如何在内部表示的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9939232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com