江小南

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表示正数。无符号数没有符号位。

分类:

后端

标签:

C++

作者介绍

江小南
V1