C编程中数据如何存储?以int变量x=123的内存分配为例
嘿,作为C语言初学者,这个问题问得特别到位——搞懂数据在内存里的存储方式,是摸透C语言底层逻辑的关键一步!咱们就拿你给出的例子main() { int x=123; }来拆解,假设int类型分配2字节内存,对应的地址是2000和2001,一步步说清楚123是怎么放进去的。
首先,先把十进制的123转成二进制:123的二进制是01111011,但因为我们的int占2字节(也就是16位),所以要在前面补0凑够16位,变成00000000 01111011。这里把这16位分成两部分:前8位00000000是高字节,后8位01111011是低字节。
接下来的核心是字节序(endianness)——不同的CPU架构,存储字节的顺序不一样,主要分两种:
小端序(Little Endian)
这是现在绝大多数桌面/笔记本电脑(比如x86、x86_64架构)采用的方式,规则很简单:低字节存在低内存地址,高字节存在高内存地址。
对应到你的例子:
- 低地址2000,存储的是123的低字节
01111011(十进制就是123) - 高地址2001,存储的是123的高字节
00000000(十进制0)
举个更直观的例子:如果x的值是258(二进制00000001 00000010),小端序下,地址2000会存00000010(十进制2),地址2001存00000001(十进制1)。
大端序(Big Endian)
有些服务器、嵌入式设备会用这种方式,规则和小端序相反:高字节存在低内存地址,低字节存在高内存地址。
对应你的例子:
- 低地址2000,存储的是123的高字节
00000000 - 高地址2001,存储的是123的低字节
01111011
同样用258举例,大端序下地址2000存00000001(十进制1),地址2001存00000010(十进制2)。
额外提醒
平时写普通的C代码时,你完全不用操心字节序的问题——编译器会帮你处理好,你只用知道变量x的值是123就行。但如果你要直接操作内存(比如用指针访问内存地址)、读写二进制文件或者做跨平台开发,字节序就必须要考虑了,不然很容易读错数据。
刚好你提到的E Balagurusamy所著的《Computing Fundamentals & C Programming》里,也专门讲解了字节序的概念,你可以翻对应的章节来加深理解~
内容的提问来源于stack exchange,提问作者Sahil

