Char数组在C

时间:2015-09-08 07:35:02

标签: c casting

这是一个理论上的问题,如果这是可行的: 最近我遇到了这段代码(小端系统):

char arr[] = {0x50, 0x60, 0x70, 0x80, 0x81, 0x82, 0x83, 0x84}; //arr size = 8
unsigned long long a = *((unsigned long long*)arr);

这2行之后的a值是9548619127672823888,而我很难理解为什么(至于演员流程),如果有人可以给我一些帮助,我会很高兴。

非常感谢!

2 个答案:

答案 0 :(得分:2)

嗯,你需要了解数字如何存储在内存中。 以十六进制写的数字0x12345678。你会如何将它存储在内存中? 让我们采用小端系统。 这个数字将按以下方式编写:

Memory Address      Value
1000                0x78 (Least significant byte goes first)
1001                0x56
1002                0x34
1003                0x12

现在,如果这是小端系统。你会如何从这些值和地址组装回整数?很容易,因为这是小端系统,我们知道存储在最低地址的第一个字节是最低有效字节。使用这种方法我们将组装:0x12345678。

你在代码中所拥有的基本上是做类似的事情(注意:这里可能存在严格的别名规则违规,你不应该这样做,我只是给你解释):

unsigned long long a = *((unsigned long long*)arr);

基本上它说:转到地址arr,解释存储在那里的值(存储在那里的值是你在数组中指定的值,注意数组的名称衰减到数组的第一个元素的地址)作为值一些整数 - 特别是无符号长整数。

它会,并且取决于字节顺序,从这些值中组合整数,就像我们在上面的示例中所做的那样。

答案 1 :(得分:1)

在该上下文中是一个指向char的指针。 (* arr将返回单个char值。)因此,他们首先将指向单字节char的指针转换为他们想要的类型的指针 - 指向8字节长的指针。指针仍然引用相同的地址,但现在会在取消引用时导致不同的行为 - 返回一个8字节的值而不是一个字节的值。