【发布时间】:2018-05-15 04:03:36
【问题描述】:
我正在阅读来自该站点 http://www.geeksforgeeks.org/little-and-big-endian-mystery/ 的小端和大端表示。
假设我们有一个数字 0x01234567,那么它在小端存储为 (67)(45)(23)(01),在大端存储为 (01)(23)(45)(67) .
char *s= "ABCDEF"
int *p = (int *)s;
printf("%d",*(p+1)); // prints 17475 (value of DC)
在上面的代码中看到这里的打印值后,似乎字符串存储为(BA)(DC)(FE)。
为什么不像第一个例子那样从 LSB 存储到 MSB 的 (EF)(CD)(AB)?我认为字节序意味着在多字节中对字节进行排序。所以排序应该是关于“整个 2 个字节”的,就像第二种情况一样,而不是在这 2 个字节内,对吧?
【问题讨论】:
-
"看到上面代码中的打印值后,"——什么打印值?在我的 little-endian 机器上,给定的代码打印出
17989(十六进制:0x4645),这对我来说似乎很正常。 -
这在我看来像 UB。
s指向 6 个字节。您将p等同于s,但是当您打印时,您会使用p+1。假设您有 4 字节ints,这将指向p到'E'。下一个字节是'F',然后接下来的 2 个字节超出了您分配的空间。但除此之外,对我来说看起来不错,我的小端打印输出是 0x25004645。 0x45是'E',0x46是'F',0x00和0x25是无人区。 -
@yano,我的编译器将 CD 视为“DC”。我有 2 个字节的整数。查看我的编辑。
-
好的,有 2 字节
int's(shorts 在我的机器上),忘记 UB,看起来仍然不错。我现在的打印输出是 0x4443,其中 0x43 是'C',0x44 是 'D'。我怀疑您将字符串 ASCII 字符与十六进制值混淆了?字符串中的每个字符对应一个字节,可以用 2 位十六进制数表示。使用printf格式说明符"%x"以十六进制打印。 17475 确实是 0x4443,这是小端机器所期望的。 -
"ABCDEF"和0xABCDEF非常不同...
标签: c pointers endianness