• [C语言] 数据存储


    类型意义:

            1.类型决定内存空间大小(大小决定了使用范围)

            2.如何看待内存空间的视角

    类型分类

            整形

    类型大小(字节)
    short2
    int4
    long4
    long8

            浮点型

    类型大小(字节)
    float4
    double8
    long double12

            构造类型

    数组
    结构性struct
    联合union
    枚举enum

             指针类型

             空类型

                    void(表示空类型,无返回值)

    原码、反码、补码

    •         计算机中的整形有符号数表示方法为 原码,补码,反码.
    •         均为符号位和数值位两部分,符号位都是用0表示"正",用1表示"负",首位为符号位
    •         三种表示方法各不相同
    •         无符号数 : 原码,反码,补码均相同.
    •         计算机存储的是 补码(可以将符号位和数值域统一处理,加法和减法统一处理,因为cpu只有加法器), 反码=补码-1,原码=反码按位取反,特殊的补码 10000000,原码为 -128
    • 无符号类型  unsigned    有符号  signed

    原码:

            直接将二进制转按照正负数的形式 换为二进制就可以

    反码

            原原码符号位不变,其他位依次按位取反即可

    补码

            反码+1即可·

    比如 : 

     int a=20;// 4字节 32bit

    原码: 00010100(8个数表示20, 前面再加24个0)

    补码,反码与 原码相同

    int b=-10;//4字节 32bit

    原码: 0000  1010(8个数表示10,前面加23个0,最前面符号位为1)

    反码: 1111   0101(前面加23个1,最前面符号位为1)

    补码: 1111(等于15)   0110(反码+1)

    转换16进制位(4个2进制位转换为1个16进制位)   补码转换16进制:0x ffffff6

    大小端介绍

    什么是大小端:

    大端(存储):  指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中

    小端(存储):  指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中

    低地址:   编号小的   

    高地址 :  编号大的

    如  0x  11 22 33 44   

    地址: 由低到高

    数据: 由高到低

            44为数据低位  ,  11为数据高位

            44为内存高地址  ,  11为内存低地址

    大端存储:11 22 33 44(人为)

    小端存储:44 33 22 11(计算机)

    //判断当前字节序:

    //思路: 内存以16进制存储,如果第一个字节为 相对应16进制数,就为小端存储 ,否则为大端.
    //比如 int a =1;  16进制为 01 00 00 00 (小端)
    //利用 char* 来 访问一个字节的内容,指针类型决定访问几个字节的数.

    //代码如下:
     

    1. int check()
    2. {
    3. int a=1;
    4. return *(char* )&a;
    5. // 取出a的地址,并把强制转换类型 为 char*(因为只需要访问字节),再解引用得到其中的数,并返回
    6. }
    7. int main()
    8. {
    9. //返回1,小端
    10. //返回0,大端
    11. int ret=check_sys();
    12. if(ret==1)
    13. {
    14. printf("小端");
    15. }
    16. else
    17. {
    18. printf("大端");
    19. }
    20. }

    例题1:

    1. main()
    2. {
    3. //数都为 -1,没赋值前补码都一致
    4. char a = -1;
    5. //原码:10000000000000000000000000000001
    6. //补码:11111111111111111111111111111111
    7. //输出为int.整形提升(按符号位补高位)
    8. //得补码:11111111111111111111111111111111(32)
    9. //为负数,原码输出还是 -1
    10. signed b = -1;
    11. //和a同理
    12. unsigned c = -1;
    13. //补码:111111111111111111111111 11111111
    14. //因为赋值类型为unsigned ,最高位为0,整形提升(按符号位补高位),
    15. //得新补码:0000000000000000000000 11111111(32)
    16. //此时为整数, 原反补码一致 为255
    17. printf("%d %d %d", a, b, c);
    18. }

    例题2:

    1. main()
    2. {
    3. //数都为 -1,没赋值前补码都一致
    4. char a = -128;
    5. //原码:100000000000000000000000 10000000
    6. //补码:111111111111111111111111 10000000
    7. //因为赋值类型为char.认为1为符号位(按符号位补高位)
    8. //得新补码:111111111111111111111111 10000000(32)
    9. //%u打印 打印十进制无符号数., 原反补码一致 为111111111111111111111111 10000000
    10. printf("%u", a);
    11. }

    char 分析: 

    有符号 char范围 : -128------127

    无符号 char范围:   0-------255

    有符号字符类型范围图:

    例题3: 

    1. main()
    2. {
    3. char a = 128;
    4. printf("%u", a);
    5. char b =- 128;
    6. printf("%u", b);
    7. //输出一致
    8. // a存不了128, 可以表示为 127+1=-128
    9. }

     例题4:(无符号 与 有符号 计算)

        

    1. int i=-20;
    2. unsigned j=10;
    3. printf("%d",i+j);
    4. //-20的 补码
    5. 11111111 11111111 11111111 11101100
    6. //10的 补码
    7. 000000 0000000 0000000 00001010
    8. 结果:
    9. 11111111 1111111 11111111 11111010 补码
    10. 11111111 1111111 11111111 11110110 反码
    11. 00000000 0000000 00000000 00001001 原码 -10

        例题5: (-1 补码 与  无符号数)

    1. unsigned int i;
    2. for(i=9;i>=0;i--)
    3. {
    4. printf("%d",i)
    5. }
    6. //无限循环
    7. //当循环到 -1 时,由于-1补码全为1, 赋值给i, i为 无符号数,修改最前面的10 ,将会变为一个超大的数.

    例题6: (字符类型范围)

    1. char a[1000];
    2. int i;
    3. for(i=0;i<1000;i++)
    4. {
    5. a[i] = -1 - i;
    6. }
    7. printf("%d", strlen(a));
    8. //参考上图 字符类型取值范围图,
    9. //当-1,-2.....到-128是,下一个数 为127,126,125.....,知道0,停止存储.
    10. //字符类型范围 -128到127

    例题7:

    1. unsigned char a[1000];
    2. int i;
    3. for(i=0;i<=255;i++)
    4. {
    5. printf("hello");
    6. }
    7. //无符号数 取值范围 0-255 , 当i为255+1 时, 将会变为 0,从而无限循环

    浮点 类型:

    基础知识:

    不带任何后缀的浮点型变量 默认double , 以f(F).l(L) 分别表示 float 和 long double 

    float 表示 6个有效字符 , double 表示 15个 , long double 表示 18个.

    浮点型 字面量,有且只有一个小数点,两侧至少一边有数字.

    指数形式:

    e(E)为底 为  十进制指数 如:2.87e-3  ,

    以0x(0X)打头,p(P)分隔的 是以 2为底数的 16进制指数  如:0x2p3=16.0

  • 相关阅读:
    Linux shell 内建命令
    appium用例参数化
    VMware 网络配置的坑:SSH连接慢、Linux无法上外网
    人工神经网络优化算法,进化算法优化神经网络
    从项目经理过渡到ScrumMaster的三个技巧
    【英语:基础进阶】D3.听力数字与时间类问题
    SpringBoot 日志文件
    基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)
    IT专业入门,高考假期预习指南
    Linux网络高级IO select poll epoll 原理及使用
  • 原文地址:https://blog.csdn.net/Mr_wenhan/article/details/136043909