我想知道字符串是如何用整数表示的,所以我编写了以下程序。
#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
的来源吗?
答案 0 :(得分:2)
你的数学错误:0x4040 == 16448
。两个分别是6 th 和 14 th 位。
答案 1 :(得分:2)
您的代码实际上会调用未定义的行为,因为您不能将char *
替换为int *
。这被称为strict aliasing rule。要查看为什么应该不被禁止的一个原因,请考虑如果代码在一个小端和大端机器上运行会发生什么。
如果你想看到字符串的十六进制模式,你应该简单地遍历它的字节并打印出每个字节。
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;
}
答案 2 :(得分:2)
这就是16448
的来源:
0x4040可以这样写成二进制文件:
4 0 4 0 -> Hex
0100 0000 0100 0000 -> Binary
2^14 2^6 = 16448
因为这里设置了第6和第14位 希望你明白了:)