C语言——有符号数是如何再内存存放的

该博客主要围绕C语言中,有符号数的存放方式展开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在 C 语言中,整是以**二进制补码形式**存储在内存中的。每个整值占用一定量的字节(通常取决于据类型的大小),例如 `int` 类型通常是4个字节(32位系统)。下面详细介绍整如何按照字节存放内存中: --- ### **1. 整的基本存储方式** - 每个整都被分解为其对应的二进制形式,并按一定的规则分配给若干字节。 - 字节由变量的据类型决定,常见的有: - `char`: 占用1个字节 (8位) - `short int`: 占用2个字节 (16位) - `int`: 占用4个字节 (32位) 或更多(依赖平台) - `long long`: 占用8个字节 (64位) --- ### **2. 存储顺序——大端模式 vs 小端模式** 在计算机内部,字节序分为两种主要的方式:**小端模式(Little Endian)** 和 **大端模式(Big Endian)**。 #### (1)小端模式 - 最低位的字节保存在最低地址处。 - 这是 x86 架构处理器使用的常见模式。 例子:假设有一个整 `x = 0x12345678` (`int`, 4字节),如果使用小端模式,则它会被存为: ``` 低地址 高地址 [0x78] [0x56] [0x34] [0x12] ``` #### (2)大端模式 - 最高位的字节保存在最低地址处。 - 常见于网络协议或某些特定架构(如 PowerPC)。 例子:同样的整 `x = 0x12345678`,在大端模式下会存为: ``` 低地址 高地址 [0x12] [0x34] [0x56] [0x78] ``` --- ### **3. 正负的区别** C 中的所有带符号整都采用**补码**来表示正负。 #### (1)正直接将其十进制转换为二进制并填充到对应字节即可。 例如:`x = 9` (占用4字节) 转换为二进制为 `00000000 00000000 00000000 00001001`。 #### (2)负首先计算其绝对值的二进制,再对其逐位取反,最后加一得到补码形式。 例如:`x = -9` 的存储过程如下: 1. 绝对值二进制:`00000000 00000000 00000000 00001001` 2. 取反:`11111111 11111111 11111111 11110110` 3. 加一:`11111111 11111111 11111111 11110111` 最终 `-9` 在 4 字节下的补码形式为:`0xFFFFFFF7`。 --- ### **4. 示例代码验证字节排列** 以下是用于检测某个系统的字节序的小程序示例: ```c #include <stdio.h> int main() { unsigned int num = 0x12345678; char *ptr = (char *)&num; if (*ptr == 0x78) { printf("Little Endian\n"); } else if (*ptr == 0x12) { printf("Big Endian\n"); } return 0; } ``` 运行上述代码可以检查当前 CPU 是否使用小端还是大端模式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值