C中字符数组到无符号long long

C中字符数组到无符号long long,c,casting,C,Casting,这是一个理论性的问题,如果可以的话: 最近我遇到了这段代码(little endian系统): 这两行之后的a值是9548619127672823888,我很难理解为什么(关于铸造过程),如果有人能给我一些帮助,我会非常感激 非常感谢 嗯,你需要了解数字是如何存储在内存中的。 取十六进制数字0x12345678。你将如何将其存储在内存中? 让我们以小端系统为例。 该编号将按以下方式书写: Memory Address Value 1000 0x78 (Le

这是一个理论性的问题,如果可以的话: 最近我遇到了这段代码(little endian系统):

这两行之后的a值是9548619127672823888,我很难理解为什么(关于铸造过程),如果有人能给我一些帮助,我会非常感激


非常感谢

嗯,你需要了解数字是如何存储在内存中的。 取十六进制数字0x12345678。你将如何将其存储在内存中? 让我们以小端系统为例。 该编号将按以下方式书写:

Memory Address      Value
1000                0x78 (Least significant byte goes first)
1001                0x56
1002                0x34
1003                0x12
现在,如果这是小端系统。如何将这些值和地址组合回整数?很容易,因为这是little endian系统,所以我们知道存储在最低地址的第一个字节是最低有效字节。使用这种方法,我们将组装:0x12345678


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

基本上它是这样写的:转到address
arr
,将存储在那里的值(存储在那里的值是您在数组中指定的值,注意数组的名称衰减到数组的第一个元素的地址)解释为某个整数的值,尤其是无符号long


它将根据endianness从这些值中组合出整数,就像我们在上面的示例中所做的那样。

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

您还没有向我们显示数组的全部内容。无论如何,该值将取决于目标系统的端点。此外,对齐。这可能只是某些系统上的SIGBUS。@Michael你是对的,我忘了-它是little endian。请尝试
printf(“%llx\n”,a)。与数组比较。非常感谢您提供的详细答案,这非常有帮助,尽管我的问题仍然是理解代码的((unsigned long long)arr)部分,我的意思是,它需要指向arr的指针的值,那么这一行有什么用呢,为什么不直接使用arr呢?@Maayan:它只是在做一个转换,说
arr
无符号长型
类型的指针。但无论如何,就像我说的那样,这可能不是个好主意。了解有关严格别名的更多信息。(例如,如果取消引用char类型的指针,它将读取一个字节)
Memory Address      Value
1000                0x78 (Least significant byte goes first)
1001                0x56
1002                0x34
1003                0x12
unsigned long long a = *((unsigned long long*)arr);