首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大端与小端小混乱

大端与小端小混乱
EN

Stack Overflow用户
提问于 2017-12-01 04:46:18
回答 2查看 2.2K关注 0票数 3

我读到了关于这个站点http://www.geeksforgeeks.org/little-and-big-endian-mystery/的小的和大的endian表示。

假设我们有一个数字0x01234567,那么在小endian中,它被存储为(67)(45)(23)(01),在大端存储为(01)(23)(45)(67)。

代码语言:javascript
复制
char *s= "ABCDEF"
int *p = (int *)s;
printf("%d",*(p+1)); // prints 17475 (value of DC)

在上面的代码中看到打印的值之后,字符串似乎被存储为(BA)(DC)(FE)。

为什么不像第一个例子那样将LSB存储为(EF)(CD)(AB)?我认为endianess意味着在多字节内排序字节。所以排序应该与“整2字节”有关,就像在第2种情况下,而不是在这2字节之内,对吗?

EN

回答 2

Stack Overflow用户

发布于 2017-12-01 05:02:42

当谈到存储字节时,Endianness并不起作用,就像s所指向的const数组中那样。如果您检查*s上的内存,您将发现字节'a''b''c' .,当在一个小的endian系统上解释为int时,它将被解释为"DCBA"

请记住,每个char都已经是一个字节,如果您有char const * s = "0xfedcab09";,并且在一个小的endian系统上执行了一个printf("%d", *(int const *)s);,那么它将打印为任何0x9abc did,就像十进制一样。

票数 1
EN

Stack Overflow用户

发布于 2017-12-01 05:45:45

这里出现的混乱是由符号引起的。

字符串“ABCDEF”可以通过多种方式解释(并存储)。

字符串中,每个字母都需要一个完整的字节(char)。

代码语言:javascript
复制
char s[] = { 'A', 'B', 'C', 'D', 'E', 'F', 0 };

但是,的十六进制表示是不同的,每个数字(‘0’.‘9’和‘A’.‘F’)只代表4位,或半字节。因此,数字0xABCDEF是字节序列。

代码语言:javascript
复制
0xAB 0xCD 0xEF

这就是痴迷成为一个问题的地方:

  • 小字节:最小字节优先 int x = { 0xEF, 0xCD, 0xAB };
  • 大端字节:最重要的字节优先 int x = { 0xAB, 0xCD, 0xEF }
  • 混合Endian: int x = { 0xEF, 0x00, 0xCD, 0xAB }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47586786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档