整形数据在内存中的存储方式

一,整形家族:

char (unsigned char) (signed char)

short (unsigned short) (signed short) [int]

int (unsigned int) (signed int)

long (unsigned long) (signed long) [int]

数据在计算机中都以二进制方式存储

整数的二进制分3种表示形式:原码,反码,补码

正整数的原反补码相同

负数原码符号位取1,其余位与其绝对值的取值表现形式相同

        反码:在原码基础上,符号位不变,其余位按位取反

        补码:在反码基础上,加1可得补码

以int(32位)类型-1为例:

        原码:10000000000000000000000000000001

        反码:11111111111111111111111111111110

        补码:11111111111111111111111111111111

为什么要使用补码的形式来进行存储?

因为计算机通常以加法的方式进行算术运算,不使用减法,所以负数需要通过补码的方式来参与运算。

二,大端小端存储:

当存储空间大于一个字节时,需要用到大小端存储的知识。

大端存储模式,是指数据的低位保存在内存的高地址中,数据的高位,保存在内存的低地址中。

小端存储模式,是指数据的高位保存在内存的低地址中,数据的低位,保存在内存的高地址中。

例如:  假设内存以从左向右,由低地址向高地址的存储

定义一个整形a = 0x11223344

则以大端存储中的存储信息显示: 11 22 33 44

小段存储显示 44 33 22 11

 设计一个程序判断当前计算机是大端字节序还是小端字节序

  

    int a = 1;                   //定义int整形占4字节,char类型占一个字节
    char* pa = (char*)&a;        //用char类型取出地址a开始第一个字节中的内容
    if (* pa == 1)               //如果*pa取出1,则证明内存中a的存储是 01 00 00 00 
        printf("是小端\n");
    else                         //如果*pa取出0,则证明内存中a的存储是 00 00 00 01
        printf("是大端\n");

三、整形提升和截断

整形提升:表达式中的字符(char)和短整型(short)操作数在使用之前会被替换成普通整形,提升时高位补充符号位。

    1、判断输出 //先整型提升相加,截断存放,再整型提升c,求原码输出

    char a = 3;                      //a提升后000000000000000000000000 00000011
    char b = 127;                    //b提升后000000000000000000000000 01111111
    char c = a + b;                  //相加后 000000000000000000000000 10000010
                                     //c截断后10000010
                                     //c提升后111111111111111111111111 10000010
    printf("%d", c);                 //求原码得-> -126
    //给字符赋值数字需先将该整形数字截断,再进行存放
    //b和a的值被提升为普通整型,然后再执行加法运算
    //加法运算完成后结果被截断,存储与c中,因为%d是取整形,所以最后再次整形提升输出

2、判断输出

    char a = -128;            //000000000000000000000000 10000000截断得 10000000
    printf("%u\n", a);        //这里%u输出unsigned int整形

    //输出int类型应先对a进行整形提升操作: 111111111111111111111111 10000000

由于输出无符号类型,所以补码 = 原码,输出一个很大的数字

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KamikazePilot

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

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

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

打赏作者

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

抵扣说明:

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

余额充值