繁体   English   中英

在C中将字符串打印为整数的混淆

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM