在C语言中,数字如何在内部表示

时间:2012-03-30 08:12:35

标签: c numbers

我是C的初学者,我的声明如下:

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

产生答案为7。我知道^是xor运算符。我假设1 4位中表示,如00016表示为0110。执行xor会将结果生成0111,即7

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

提前致谢。

4 个答案:

答案 0 :(得分:5)

这里有两点略有不同的事情要考虑。

C语言标准表示文字16的类型为int,因此将使用int类型执行XOR操作。

C语言标准还说int类型具有二进制表示,其中值位从增加的2的幂增加到最重要,加上符号位在这里不相关,因为数字两者都是正数,加上可选的一些填充位(我从来没有使用过int中有任何填充位的C实现。)

所以在这些方面,你是对的:1表示为二进制16表示为二进制1107是{ {1}},加上初始0足以构成111类型的大小。在写二进制数时,即使我们知道它的类型是32位,我们也很难写int

在大多数实现中,00000000000000000000000000000001中的值+符号位数为32。您可能偶尔会看到64或甚至16.标准要求至少16,但过去它允许任何数字。

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

这一切都在标准中,但标准也说它只描述了“抽象机器”的行为。您的编译器实际上所做的需要具有与标准所说的相同的结果,但是不需要任何给定的代码片段,您将在程序运行时在内存中看到这些精确的表示。如果编译器为您的行发出相同的代码,就像它为intprintf("7");发出的代码一样,这是完全合法的。因此,在发出的代码中可能没有fputc('7', stdout);的任何表示。

如果1被实现为库的一部分并且编译器不打算预测printf("%d", 7);对该库的含义,它可能只会优化到printf。也许它会在运行时进行计算,但代表"%d"但是它认为对于目标CPU来说是最紧凑和/或最有效的,只要编译器首先证明它自己满意,不同的大小将产生同样的结果。例如,一些指令集允许所谓的“立即值”,它们是作为指令的一部分存储的小整数。 1的表示仍然是一些0,最后有一个1,但由于immediates必须符合指令,因此它们通常小于1

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

答案 1 :(得分:3)

数字(或更确切地说 - )表示计算机的构建方式。如果计算机是使用4位字构建的 - 那就是你所描述的。现代计算机每个字使用32或64位,并且有大端和小端表示。

此外,分数的表示变化很大,有几种不同的标准。

各种编程语言之间也可能有所不同(尽管大多数使用类似的约定和标准)。

最终它全部减少为位和字节。

答案 2 :(得分:1)

整数的位数取决于您的体系结构 - 例如32或64位。

数字1是一个int,因此32位体系结构由4个字节或32位表示。

答案 3 :(得分:0)

由于C不是解释语言,因此没有整数(或浮点数或字符)的“内部表示”。 C语言标准中有一些规则限制或定义必须所具有的不同类型的位数,以及与该语言中其他类型相比的最小位数。

最后,您的体系结构会影响整数在执行期间的位数。在这种特殊情况下,8位可能就足够了,但您需要检查生成的机器代码/汇编器才能确定。