在C中将字符串打印为整数的困惑

时间:2014-12-21 04:53:50

标签: c string integer

我想知道字符串是如何用整数表示的,所以我编写了以下程序。

#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的来源吗?

3 个答案:

答案 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位 希望你明白了:)