C/C++整形是如何内存中存储的?快速搞懂字节序

在计算机中,整数数据以二进制形式 翻译成 补码 存储在内存中。

字节序指的是字节在内存中存储的顺序。有大端字节序和小端字节序两种。

大端字节序表示高位字节存储在低地址,低位字节存储在高地址。比如整数0x12345678以大端字节序存储时,在内存中的地址从低到高依次是0x12、0x34、0x56、0x78。

小端字节序表示高位字节存储在高地址,低位字节存储在低地址。比如整数0x12345678以小端字节序存储时,在内存中的地址从低到高依次是0x78、0x56、0x34、0x12。

字节序的选择取决于计算机体系结构,不同的处理器架构可能采用不同的字节序。在编程时,跨平台开发时要注意字节序的影响

建议直接从主函数观看理解代码,如果有任何不懂的问题,欢迎在下方评论,进行解答!

——————————————————————————————————————————

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <limits.h>
#include <windows.h>
#include <string.h>

int check_sys()
{
    int a = 1;
    return *(char*)&a;
}


int main() 
{
    INT_MAX;/*宏定义的一个最大范围*/
    int num = 10;
    //创建一个整形变量,叫num,这时num向内存申请4字节~32个比特位
    // 符号位 数值位
    //正数原反补相同
    //负数(数字-10为例子) 最高位是符号位1表示负数
    //1 0000000 00000000 00000000 00001010
    //反码:符号位不变 其它位0变1,1变0
    //1 1111111 11111111 11111111 11110101
    //补码:反码+1
    //1 1111111 11111111 11111111 11110110

    //整数在内存中存的是补码,且是倒着存储的
    //vs为了方便显示,用16进制表示
    //-10
    //F6 FF FF FF

    //计算1-1
    // 00000000 00000000 00000000 00000001 是1的补码
    // 11111111 11111111 11111111 11111111 是-1的补码
    //100000000 00000000 00000000 00000000 1+(-1)是这样的计算的计算机

    //把存放的地址看出x横轴,那么左边:低地址   右边:高地址
//  0x11 22 33 44  
    //11 22 33 44 大端字节序
    //44 33 22 11 小端字节序
    //大端字节序存储:把数据低位,存放在高地址
    //小端字节序存储:把数据低位,存放在低地址
    //计算机一般存储是小端字节序
    int a=1;
    char* p = (char *) & a;//int*
    //如何判断小端还是大端字节序
    if (1 == *p) 
    {
        printf("小端\n");
    }
    else 
    {
        printf("大端\n");
    }
    
    int ret=check_sys();
    if(1==ret)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }

//对于整形家族(char short int long),有:有符号和无符号的区分
//     有符号最高位是符号位
//    无符号所以的位全是有效位(算补码的时候高位补0再算,因为无符号数默认是正数)
//  char 是不确定的
//    int == signed int;
//     unsigned int;
//  short == signed short;
//     unsigned short;
//  long == signed long;
//    unsigned long;

    char aa = -1;
    signed ab = -1;
//1 00000000 00000000 00000000 0000001正
//1 11111111 11111111 11111111 1111110反
//1 11111111 11111111 11111111 1111111补(存储的数据)
//由于char只能容纳1字节~8bit
//所以从低位,截出来8bit
//1 1111111--aa,bb(发生整形提升)--发现是负数
/*-------------计算机存储和读取分界线-----------------*/
//1 11111111 11111111 11111111 1111111补(存储的数据)
//1 11111111 11111111 11111111 1111110反
//1 00000000 00000000 00000000 0000001正

    unsigned char ac = -1;
//00000000 00000000 00000000 00000001正
//11111111 11111111 11111111 11111110反
//11111111 11111111 11111111 11111111补
//1111111--ac(发生整形提升)--发现是正数
/*-------------计算机存储和读取分界线-----------------*/
//00000000 00000000 00000000 11111111补-反-正相同
//%d 十进制有符号整形整数

//整形提升 按变量数据类型的符号位来提升
    printf("a=%d,b=%d,c=%d\n",ab,ab,ac);
//-1 -1 255

    char aaa = -128;
//1 00000000 00000000 00000000 10000000正
//1 11111111 11111111 11111111 01111111反
//1 11111111 11111111 11111111 10000000补
//1 10000000
/*-------------计算机存储和读取分界线-----------------*/
//1 11111111 11111111 11111111 10000000 -128 有符号数
//11111111 11111111 11111111 10000000 好大一个数字
    printf("d:aaa=%d u:aaa=%u\n",aaa,aaa);

    char aaaa = 128;
//00000000 00000000 00000000 10000000
//10000000
//11111111 11111111 11111111 10000000
    printf("d:aaaa=%d u:aaaa=%u\n", aaaa, aaaa);

    int i = -20;
    unsigned int j = 10;
//1 10000000 00000000 00000000 00010100 正
//1 11111111 11111111 11111111 11101011反
//1 11111111 11111111 11111111 11101100补

//下面的存储方式具体如何存储要看是%d,还是%u,
//1 11111111 11111111 11111111 11101100  i的存储(%d)
//1 11101100 i的存储(%u)

//0000000 00000000 00000000 00001010 j的存储(%d)
//00001010 j的存储(%u)

//1 11101100 
//  00001010

//1 11110110(存) i和j的存储


//补码-->源码的2种方法
//@1 -1 取反
//@2 取反 +1
//1 00001010(读)
//11111111 11111111 11111111 11110110
    printf("%d,%u\n", i + j, i + j);

    char a1[1000];
    int i1;
    for (i1=0;i>1000;i++) 
    {
        a1[i1] = -1 - i1;

    }
    printf("%d",strlen(a1));

-----------------------------------------------------------------------------------------------------------------------------

//下面这个是一个死循环-1无符号数是一个很大的数字
    unsigned int i;
    for (i = 9; i >= 0; i--)
    {
        printf("%u\n", i);
        Sleep(1000);
    }

//同样是死循环
    unsigned char i2 = 0;//unsigned char 0~255
    for (i=0;i<=255;i++) 
    {
        printf("hello world\n");
    }


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

foreverInDebug Hou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值