2012-04-30 52 views
0

就我所知,在C编程语言中,数组按元素存储在存储器元素中。 (即,元素0,元素1,元素2,...,元素n)。我试图用以下代码看到:将无符号字符数组转换为整数

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

由于无符号字符是1个字节,整数是4个字节;我认为它具有打印值:

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

然而,当我运行这个程序,它会为每个试验产生不同的结果。

我在这里错过了什么?

+0

在大多数计算机上,字节顺序与您所假设的相反。 –

+0

相关:http://stackoverflow.com/q/29969049/694576 – alk

回答

4

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

然而,这将调用实现定义:

  • 取决于你的平台的endianness你会得到不同的结果。
  • 根据平台的不同,char阵列可能无法正确对齐以读取为int
  • 编译器可能会根据假设决定进行时髦的优化,您将永远不会通过int *读取char阵列 - 您正在破坏所谓的严格别名规则
+0

此外,它打印什么取决于这个盒子上的排序。 –

+1

Re“根据字节顺序,您将得到两种不同的结果之一。”不只是两个。周围仍然有一些混合的末端框。例如,0x2143或0x3412。 –

+0

@大卫:公平点;措辞相应地适应! –

相关问题