C语言:数据在内存中的存储

大家好,上次学习还是5月31,从今天开始,暑假学习正式开始喽!快一起叭。

这次的内容是数据在内存中的存储。

仍然是点赞+关注,追番不迷路,谢谢大家!

在这里插入图片描述

1. 整数在内存中的存储

(1)整形存储的是二进制的补码

这部分的内容我们在之前已经讲解过了,具体内容在链接

整数有原码,反码,补码这三种2进制的表达形式。但是内存中存放的是补码。计算使用的是内存中的二进制,所以计算使用的就是补码

在这里插入图片描述

有符号的整数,三种表示方法均有(符号位,数值位)两部分,符号位是最高位的一位:且0表示正,1表示负。其余的31位均是数值位。

  1. 正整数的原反补均相同。
  2. 负整数的原反补均不一样。
  • 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
  • 反码:原码的符号位不变,其余位按位取反(~)
  • 补码:反码+1

(2) 大小端字节序和字节序判断

整数在内存中存储时非常重要的一个事情

为什么是‘字节序’?因为是以字节为单位来讨论它们的顺序

地址:低--------------------->高(从左到右,低地址–>高地址)
内容:高--------------------->低(从左到右,万千百十,高字节内容–>低字节内容)

大端字节序(正着放):将一个数据的低位字节内容 存放在内存的高地址处
小端字节序(倒着放):将一个数据的高位字节内容存放在内存的高地址处

在这里插入图片描述
上图展示的就是小端字节序。

(3)练习

练习一:请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。

----思绪
【从简单开始,设a的值是1(a是int类型,占4个字节),它的十进制是0x00 00 00 01。如果是大端字节序(01 00 00 00,小端(00 00 00 01),只需要去拿四个字节中的第一个字节,如果是大端字节序存储,则第一个字节是1,小端则第一个字节是0。现在需要想办法拿到int类型数字的第一个字节----拿到首个字节的地址,强制类型转换成char*,之后再解引用,即可拿到第一个字节的内容】

int main()
{
    int a = 1;
    if (*(char*)&a == 1)
        printf("小端字节序储存\n");
    else
        printf("大端字节序储存\n");
    return 0;
}

练习二

int main()
{
    signed char a = -1;
    unsigned char b = -1;
    printf("a=%d,b=%d", a, b);
    //%d打印有符号整数,%u是打印无符号整数
    return 0;
}

-1的原码:10000000000000000000000000000001
-1的反码:1111111111111111111111111111111111110
-1的补码:1111111111111111111111111111111111111
以上写的是int类型,4个字节,8个比特位。但是a和b是char类型,8个比特位(现在取int类型低位的8个比特位)所以a(char类型)里面放的是11111111,%d(整数32比特位)打印它的时候,【所以需要整型提升】signed提升之后a是11111…(32位)之后取反加一得数值-1。无符号unsigned提升,其余高位补0,即000…11111111,开头是0,正数,反即原,即255

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值