我是C的初学者,我的声明如下:
printf("%d",(1^6));
Run Code Online (Sandbox Code Playgroud)
产生答案为7.我知道^是xor运算符.我认为在这里,1在代表4位像0001和6作为0110.做异或产生作为结果0111是7.
这是我的假设是正确的吗?在C语言中,数字如何在内部表示?
提前致谢.
这里有两个稍微不同的东西需要考虑.
C语言标准表示文字1和6类型int,因此XOR操作将使用该int类型执行.
C语言标准还表示该int类型具有二进制表示,其中值位从增加的2的幂增加到最重要,加上在此处不相关的符号位,因为数字都是正数,加上可选的一些填充位(我从未使用过具有任何填充位的C实现int).
所以在这些方面,你是对的:1表示为二进制1,6表示为二进制110,7是111,加上有足以构成类型大小的初始0 int.当写二进制数00000000000000000000000000000001时,即使我们知道它的类型是32位,我们也很难写.
int在大多数实现中,a中的值+符号位的数量是32.您可能偶尔会看到64或甚至16.标准要求至少16,但过去它允许任何数字.
一个int通常所占的存储多个字节.该标准没有说明最低有效位是占用第一个(最低寻址的)字节,还是最后一个(最高寻址的)或中间的某个位置.所以它允许little-endian和big-endian表示,理论上也是"中端"表示(我从未见过其中一个,至少不是这样int).Endian-ness与int内存中的表示有关,但它与按位运算(包括XOR)无关,它们按照有效位的顺序定义,而不是按照它们在内存中的顺序来定义.
这一切都在标准中,但标准也说它只描述了"抽象机器"的行为.你的编译器实际上确实需要有相同的结果为标准说什么,但对于任何给定的代码段,你会看到那些确切表示在内存中的程序运行时没有要求.编译器为你的线路发出相同的代码是完全合法的,如果它想要发射printf("7");甚至fputc('7', stdout);是它.因此,1在发出的代码中可能没有任何表示.
也许它只会优化printf("%d", 7);,如果printf实现了库的一部分,并且编译器不打算预测"%d"到该库的含义.也许它会在运行时进行计算,但表示1它认为目标CPU最紧凑和/或最有效,只要编译器首先证明自己满意,不同的大小将产生相同的结果.例如,一些指令集允许所谓的"立即值",它们是作为指令的一部分存储的小整数.表示1仍然是一些0,最后一个1,但因为immediates必须适合一个指令,他们通常会小于int.
这种事情的确切细节取决于您的编译器,目标体系结构,优化级别以及可能的其他编译器选项.