江
江小南
V1
2023/01/16阅读:24主题:萌绿
【C语言】小端存储与补码
阅读本文,需要对C语言的基础知识有所了解。C语言基础,我给大家准备了详细的学习资料,微信公众号主页回复“C语言”即可领取。
1. 小端存储
什么是小端存储?
x86架构都是使用的小端存储。小端存储是低字节在前,即低字节在低地址。高字节在后,即高字节在高地址。例如:2使用十六进制表示为00 00 00 02,但在计算机中实际的存储为02 00 00 00。

计算机内存都是以十六进制表示。
大端存储和小端存储刚好相反。
2. 补码
负数在内存中以补码的形式存储。
问题:如何实现2-5?
分析:计算机的CPU无法做减法操作,只能做加法操作。CPU中有一个逻辑单元叫加法器。
#include <stdio.h>
int main() {
int i,j,k;
i=-5;
j=2;
k=j+i;
printf("k=%d\n",k);
return 0;
}
F:\Computer\Project\practice\20\20.3-Complement\cmake-build-debug\20_3_Complement.exe
k=-3
进程已结束,退出代码为 0
解析:实现2-5的方法是2+(-5),由于计算机只能存储0和1,5的二进制数为101,称为原码。计算机用补码表示-5,补码是对原码取反后加1的结果。

如上图:-5在内存中存储为0xfffffffb,对其加2后得0xfffffffd它就是k的值。当最高位为1时表示负数。我们在通过取反加1得到原码,也就是3,由于是负数,所以就是-3。


说明:补码得原码的时候先取反再加1和先减1再取反效果一样。
3. 反码
通过8位表示,-5的补码为1111 1011,-5的原码为10000 0101,符号位不动的,只有值的部分是5。
反码是一种在计算机中数的机器码表示。对于单个数值(二进制的0和1)而言,对其进行取反操作就是将0变成1,1变成0,正数的反码和原码一样,负数的反码就是在原码的基础上符号位保持不变,其他位取反。
十进制 | 原码 | 反码 |
---|---|---|
6 | 0000 0110 | 0000 0110 |
-3 | 1000 0011 | 1111 1100 |
说明:对于有符号数,最高位是符号位,1表示负数,0表示正数。无符号数没有符号位。
作者介绍
江
江小南
V1