任何人都可以向我解释以下基于小端和大端的输出。我已经阅读了许多有关此概念的文章和帖子,但在做了这么多事情之后,我无法获得有关此主题的任何内容.一切都超出了我的想象。
任何帮助将不胜感激。提前致谢! 源代码: 将 int 的大小视为两个字节,将 char 的大小视为一个字节
int main()
{
int a = 300;
char *b = (char *)&a;
*++b = 2;
printf("%d ",a);
return 0;
}
最佳答案
首先,从技术上讲,标准并未指定这一点,因为整型类型的表示取决于实现,直接更改 int 值中的字节可能会导致陷阱表示。
话虽如此,您声明您的实现使用(您声明了一些,我假设剩下的):
- 8 位字符(字节和字符根据定义具有相同的大小)
- 2 个字节表示一个 int(16 位)
- 无填充位 - 15 个值位和 1 个符号位为 2 的补码
这里没有陷阱表示,并且允许访问字节级别的任何对象
现在让我们看看会发生什么:
a
十进制为 300,十六进制为 0x12C
在小端表示中,(char *) &a
将指向 2 个字符的数组 { 0x2c, 1 }
- 它将是 { 1, 0x2C }
采用大端字节序
接下来*++b = 2
首先增加指针并将2赋给指向的值。
等效的 char 数组现在是小尾数中的 { 0x2c, 2 }
和大尾数中的 { 1, 2 }
。
让我们将其转换回 int,我们在小端字节序中得到 0x22C = 556,在大端字节序中得到 0x102 = 258
关于您能使用小端概念解释以下源代码的输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768737/