【问题标题】:Converting unsigned char array to an integer将无符号字符数组转换为整数
【发布时间】:2012-05-10 09:52:55
【问题描述】:

据我所知,在 C 编程语言中,数组是逐个元素存储在内存中的。 (即元素 0、元素 1、元素 2、...、元素 n)。我正在尝试使用以下代码查看:

unsigned char a[] = { '\1' , '\2', '\3' ,'\4' };  
printf("%d\n", (int*) a);

由于 unsigned char 是 1 个字节,整数是 4 个字节;我认为它必须打印值:

00000001 00000010 00000011 00000100 = 2^2 + 2^8 + 2^9 + 2^17 + 2^24 = 16909060

但是,当我运行这个程序时,每次试验都会产生不同的结果。

我在这里错过了什么?

【问题讨论】:

标签: c++ c arrays char int


【解决方案1】:

您可能想使用*(int *)a,否则您只是在打印一个地址。

但是,这将调用实现定义的行为:

  • 您将获得不同的结果,具体取决于您平台的endianness
  • 根据平台,char 数组可能无法正确对齐以读取为int
  • 编译器可能会基于您永远不会通过int * 读取char 数组的假设执行时髦的优化 - 您违反了所谓的严格别名规则。

【讨论】:

  • 此外,它打印的内容取决于此框的字节序。
  • Re“根据字节顺序,您将获得两种不同结果之一。”不只是两个。周围仍然有一些混合字节序框。例如,0x2143 或 0x3412。
  • @OliCharlesworth:是的。谢谢。效果很好。我的平台(visual studio)的字节序是:00000100 00000011 00000010 00000001。我认为它被称为“小字节序”。
  • 是否可以使用独立于实现的方法进行这种转换?也许编写一个函数来遍历 unsigned char 数组的每一位并返回一个“long int”类型?
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多