[英]Confusion on printing strings as integers in C
我想知道字符串如何用整数表示,因此我编写了以下程序。
#include <stdio.h>
int main(int argc, char *argv[]){
char name[4] = {"@"};
printf("integer name %d\n", *(int*)name);
return 0;
}
输出为:
integer name 64
这是可以理解的,因为@
整数是64
,即十六进制的0x40
。
现在,我将程序更改为:
#include <stdio.h>
int main(int argc, char *argv[]){
char name[4] = {"@@"};
printf("integer name %d\n", *(int*)name);
return 0;
}
输出为:
integer name 16448
我不明白这一点。 由于@@
是十六进制的0x4040
。 所以应该是2^12+2^6 = 4160
如果我在字符串末尾计算'\\0'
,则它应该是2^16+2^10 = 66560
有人可以解释16448
来源吗?
您的数学错误: 0x4040 == 16448
。 这两个四位分别是第6 位和第 14位。
您的代码实际上调用了未定义的行为,因为您不能为char *
加上int *
别名。 这就是严格的别名规则 。 要查看为什么不应该这样做的一个原因,请考虑一下,如果代码是在小型又大型的endian机器上运行的,那将会发生什么。
如果要查看字符串的十六进制模式,则应仅循环其字节并打印出每个字节。
void
print_string(const char * strp)
{
printf("0x");
do
printf("%02X", (unsigned char) *strp);
while (*strp++);
printf("\n");
}
当然,除了打印字节外,您还可以将它们移位为一个整数(很快就会溢出),最后才输出该整数。 在执行此操作时,您将不得不坚持“您的”字节序。
/* Interpreting as big endian. */
unsigned long
int_string(const char * strp)
{
unsigned long value = 0UL;
do
value = (value << 8) | (unsigned char) *strp;
while (*strp++);
return value;
}
16448
就是16448
来的:
0x4040可以这样写成二进制:
4 0 4 0 -> Hex
0100 0000 0100 0000 -> Binary
2^14 2^6 = 16448
因为这里设置了第6位和第14位。
希望你明白了:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.