【划重点】深入底层:数据的存储

本文详细介绍了计算机中整数的原码、反码和补码表示方法,以及它们在内存中的存储方式。在32位整数的例子中,20的补码表示为0x00000014,而-10的补码表示为0xFFFFFFF6。此外,还探讨了大端存储和小端存储的概念,并提供了一个简单的C代码示例来判断机器是大端还是小端存储。文章最后揭示了作者的计算机采用小端存储模式。
摘要由CSDN通过智能技术生成

1.整形在数据中的存储

比如:

int a = 20;
int b = -10

我们知道int类型的a会分配4个字节的空间,那该如何存储呢?

这里要涉及到一个概念:原码,反码,补码。

1.1原码,反码,补码

计算机中的有符号数(整数)有三种表示方法,即原码,反码,补码。

三种表示方法均有符号位数值位为组成,符号位都是用“0”表示正,用“1”表示负,数值位的三种表示形式各不相同。

原码

直接将数字按照正负数翻译成2进制的数字即可。

反码

将原码除符号位按位取反也就是1改成0,0改成1。

补码

反码加1则得到补码。

我们再回到之前的问题

int main()
{
    int a = 20;
     //00000000 00000000 00000000 00010100 正数的原码,反码,补码相同
    int b = -10;
//原码 10000000 00000000 00000000 00001010
//反码 11111111111111111111111111111110101
//补码 11111111111111111111111111111110110
    return 0;
}

5cb1f4973f2047568e233ac84fa23b13.png

 上面的内存是怎么来的呢?

对于整形来说,数据存放内存的时候其实存放的是补码。

这里面的存储是16进制,也就是4位2进制转化为1个16进制。

int main()
{
    int a = 20;
     //0000 0000 0000 0000 0000 0000 0001 0100
     //  0    0    0    0    0    0    1    4
     //        0x00000014
    int b = -10;
//原码 10000000 00000000 00000000 00001010
//反码 11111111111111111111111111111110101
//补码 1111 1111 1111 1111 1111 1111 1111 1111 0110
//       F    F    F    F    F    F    F    F    6
//             0xFFFFFFF6
    return 0;
}

2.大端存储和小端存储

2.1什么是大端小端?

大端存储模式:是指数据的低位保存到高地址处,数据的高位保存到低地址处。

小端存储模式:是指数据的低位保存到低地址处,数据的高位保存到高地址处。

              大端存储   小端存储          

低地址         14             00

                    00             00

                    00             00

高地址         00             14

2.2如何判断机器是大端存储还是小端存储?

这里用代码的形式来实现。

通过指针里的数据进行判断。

#include <stdio.h>
int main()
{
    int a = 1;
    char* p = (char*)(&a);
    if (*p == 1)
    {
        printf("小端存储\n");
    }
    if (*p == 0)
    {
        printf("大端存储\n");
    }
    return 0;
}

963c081adfd04f8ba67bb7a2710e40f2.png

 而我的电脑也很明显是小端存储了。

 

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦不止~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值