我是C的初学者,我的声明如下:
printf("%d",(1^6));
产生答案为7
。我知道^
是xor运算符。我假设,1
在 4位中表示,如0001
和6
表示为0110
。执行xor会将结果生成0111
,即7
。
这是我的假设是正确的吗?在C语言中,数字如何在内部表示?
提前致谢。
答案 0 :(得分:5)
这里有两点略有不同的事情要考虑。
C语言标准表示文字1
和6
的类型为int
,因此将使用int
类型执行XOR操作。
C语言标准还说int
类型具有二进制表示,其中值位从增加的2的幂增加到最重要,加上符号位在这里不相关,因为数字两者都是正数,加上可选的一些填充位(我从来没有使用过int
中有任何填充位的C实现。)
所以在这些方面,你是对的:1
表示为二进制1
,6
表示为二进制110
,7
是{ {1}},加上初始0足以构成111
类型的大小。在写二进制数时,即使我们知道它的类型是32位,我们也很难写int
。
在大多数实现中,00000000000000000000000000000001
中的值+符号位数为32。您可能偶尔会看到64或甚至16.标准要求至少16,但过去它允许任何数字。
int
通常占用多个字节的存储空间。该标准没有说明最低有效位是占用第一个(最低寻址的)字节,还是最后一个(最高寻址的)或中间的某个位置。所以它允许little-endian和big-endian表示,理论上也是“中端”表示(我从未见过其中一个,至少不是int
)。 Endian-ness与int
在内存中的表示有关,但它与按位运算(包括XOR)无关,它们按照有效位的顺序定义,而不是按照它们在内存中的顺序来定义
这一切都在标准中,但标准也说它只描述了“抽象机器”的行为。您的编译器实际上所做的需要具有与标准所说的相同的结果,但是不需要任何给定的代码片段,您将在程序运行时在内存中看到这些精确的表示。如果编译器为您的行发出相同的代码,就像它为int
或printf("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位可能就足够了,但您需要检查生成的机器代码/汇编器才能确定。