您能使用小端概念解释以下源代码的输出吗?

标签 c pointers

任何人都可以向我解释以下基于小端和大端的输出。我已经阅读了许多有关此概念的文章和帖子,但在做了这么多事情之后,我无法获得有关此主题的任何内容.一切都超出了我的想象。

任何帮助将不胜感激。提前致谢! 源代码: 将 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/

相关文章:

c# - .NET 中的已检查和未检查异常

pointers - Go 的接口(interface)在什么意义上可以被视为指针?

c - 联网L2/L3项目构想?

c++ - 如何从远程线程 DestroyWindow?

iphone - 如何从应用程序委托(delegate)、 Storyboard、iOS6 获取我的 View Controller 的实例

c - 从文件创建链接列表时程序总是崩溃

c++ - ISR 中使用的指针指向寄存器

c - 一个地址怎么可以有多个值呢?

c - 方法执行时 QEMU 崩溃

c - 使用 C 中的文本文件的银行帐户存款选项