• C进阶-数据的存储


    数据类型介绍

    内置类型:

    1. //数据类型中的内置类型
    2. // char //字符数据类型
    3. // short //短整型
    4. // int //整型
    5. // long //长整型
    6. // long long //更长的整型
    7. // float //单精度浮点数
    8. // double //双精度浮点数

     数据在内存中存储:

    1.原码、反码、补码 

    1. //数据类型中的内置类型 单位是字节
    2. // char //字符数据类型 1
    3. // short //短整型 2
    4. // int //整型 4
    5. // long //长整型 4/8
    6. // long long //更长的整型 8
    7. // float //单精度浮点数 4
    8. // double //双精度浮点数 8
    9. //整数数据的二进制表示形式有三种:原码,补码,反码
    10. //三种方法的均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示负
    11. //数值位正数的原、反、补码都相同
    12. int main()
    13. {
    14. //INT_MAX;
    15. int num = 10;//创建一个整型变量,叫num,这时num向内存申请4个字节来存放数据
    16. //4个字节-32比特位
    17. //00000000000000000000000000001010 原码
    18. //00000000000000000000000000001010 反码
    19. //00000000000000000000000000001010 补码
    20. int num1 = -10;
    21. //10000000000000000000000000001010 原码
    22. //11111111111111111111111111110101 反码
    23. //11111111111111111111111111110110 补码
    24. return 0;
    25. }
    26. //字符存储的时候存储的是ASCII码值,存储的是ASCII码值,是整型,所有归类的时候放在整型家族
    27. //计算1-1 = 1+(-1)
    28. //原码计算错误
    29. //0000000000000000000000000000001
    30. //1000000000000000000000000000001
    31. //1000000000000000000000000000010
    32. //补码计算
    33. //0000000000000000000000000000001 1的补码
    34. //1111111111111111111111111111111 -1的补码
    35. //0000000000000000000000000000000

    2.大端、小端

    字节序和大小端:

    1. //1.字节序 - 是以字节为单位,讨论存储顺序的
    2. //2.小端字节序存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处
    3. //大端字节序存储:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容,存放在低地址处
    4. // int main()
    5. // {
    6. // int a = 0x11223344;
    7. // return 0;
    8. // }
    9. //写个程序,如何来判断大小端
    10. //小端返回1
    11. //大端返回0
    12. int check_sys()
    13. {
    14. int a = 1;
    15. // if(*(char*)&a ==1)
    16. // {
    17. // return 1;
    18. // } else
    19. // {
    20. // return 0;
    21. // }
    22. return *(char*)&a;
    23. }
    24. int main()
    25. {
    26. int ret = check_sys();
    27. if(ret==1)
    28. {
    29. printf("小端\n");
    30. } else
    31. {
    32. printf("大端\n");
    33. }
    34. // int a = 1;
    35. // char* p = (char*)&a;//int*
    36. // if(*(char*)&a ==1)
    37. // //if(*p == 1)
    38. // {
    39. // printf("小端\n");
    40. // } else
    41. // {
    42. // printf("大端\n");
    43. // }
    44. return 0;
    45. }

     判断有符号位和无符号位的区别:

    1. //对于整型家族类型来说,有符号和无符号的区分
    2. //char 到底是signed char 还是unsigned char 不确定
    3. //char 在VS上 --> signed char
    4. //short == signed short
    5. //unsigned short
    6. //int ==signed int
    7. //unsigned int
    8. int main()
    9. {
    10. char a = -1;
    11. //10000000000000000000000000000001
    12. //11111111111111111111111111111110
    13. //11111111111111111111111111111111 -截断
    14. //11111111 -a
    15. //11111111111111111111111111111111
    16. //11111111111111111111111111111110
    17. //10000000000000000000000000000001
    18. signed char b = -1;
    19. //11111111111111111111111111111111 -截断
    20. //11111111 -b
    21. //11111111111111111111111111111111
    22. //11111111111111111111111111111110
    23. //10000000000000000000000000000001
    24. unsigned char c = -1;
    25. //11111111 -c
    26. //00000000000000000000000011111111
    27. printf("a=%d\n,b=%d\n,c=%d\n",a,b,c); // -1 -1 255
    28. //%d - 十进制的形式打印有符号整型整数
    29. //整型提升
    30. return 0;
    31. }
    32. // int main()
    33. // {
    34. // char a = -128;
    35. // //10000000000000000000000010000000 补码
    36. // //11111111111111111111111101111111 反码
    37. // //11111111111111111111111110000000 原码
    38. // //-128补码
    39. // //10000000
    40. // //11111111111111111111111110000000
    41. // printf("%u\n",a); //打印无符号位十进制整数 4294967168
    42. // return 0;
    43. // }
    44. // int main()
    45. // {
    46. // char a = 128;
    47. // //00000000000000000000000010000000 原反补相同
    48. // //128补码
    49. // //10000000
    50. // //11111111111111111111111110000000
    51. // printf("%u\n",a); //打印无符号位十进制整数 128
    52. // return 0;
    53. // }
    54. int main()
    55. {
    56. int i = -20;
    57. //10000000000000000000000000010100
    58. //11111111111111111111111111101011
    59. //11111111111111111111111111101100
    60. unsigned int j = 10;
    61. //00000000000000000000000000001010
    62. //11111111111111111111111111101100
    63. //11111111111111111111111111110110 i+j 补码
    64. //11111111111111111111111111110101
    65. //10000000000000000000000000001010 -10
    66. printf("%d\n", i+j); //-10
    67. return 0;
    68. }

    有无符号练习题:

    1. // int main()
    2. // {
    3. // //unsigned int i; //全部变成无符号,死循环
    4. // int i;
    5. // for (i = 9;i >= 0;i--)
    6. // {
    7. // printf("%u\n",i);
    8. // sleep(1); //单位是秒
    9. // }
    10. // return 0;
    11. // }
    12. // int main()
    13. // {
    14. // char a[1000]; //char -128~127
    15. // int i;
    16. // for (i = 0; i < 1000; i++)
    17. // {
    18. // a[i] = -1 -i;
    19. // }
    20. // printf("%d\n",strlen(a)); //255
    21. // }
    22. unsigned char i = 0; //变成无符号,死循环
    23. int main()
    24. {
    25. for(i = 0; i <= 255; i++)
    26. {
    27. printf("hello world\n");
    28. }
    29. return 0;
    30. }

    浮点型在内存中的存储:

    浮点数存储规则:

    num和*pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。
    详细解读 :
    根据国际标准IEEE ( 电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式
    (-1)^S*M*2NE
    。(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
    M表示有效数字,大于等于1,小于2.
    2^E表示指数位。
    举例来说:十进制的5.0,写成二进制是 101.0,相当于 1.01x2入2。那么,按照上面V的格式,可以得出s=0M=1.01 ,E=2。
    十进制的-5.0,写成二进制是-101.0,相当于-1.01x2^2。那么,s=1,M=1.01,E=2。
    IEEE 754规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
     

     

    1. #include
    2. #include
    3. //浮点型在内存中的存储
    4. //浮点数:数学中的小数
    5. //整型和浮点型在内存中的存储方式有差异
    6. // int main()
    7. // {
    8. // int n = 9;
    9. // //00000000000000000000000000001001
    10. //S E M
    11. //0 -126 0.00000000000000000001001
    12. //(-1)^0 * 0.00000000000000000001001 * 2^-126
    13. // float* pFloat = (float*)&n;
    14. // printf("n的值为:%d\n",n); //9
    15. // printf("pFloat的值为:%f\n",*pFloat); //0.000000 小数点后六位
    16. // *pFloat = 9.0;
    17. //1001.0
    18. //1.001 * 2^3
    19. //(-1)^0 * 1.001 * 2^3
    20. //S=0 E=3 M=1.001
    21. // printf("num的值为:%d\n",n); //1091567616
    22. // printf("*pFloat的值为:%f\n",*pFloat); //9.000000
    23. // return 0;
    24. // }
    25. int main()
    26. {
    27. float f = 5.5;
    28. //101.1
    29. //1.011 * 2^2
    30. //(-1)^0 * 1.011 * 2^2
    31. //S=0,M=1.011,E =2
    32. // 0100 0000 1011 0000 000000000000000
    33. // 0x40b00000
    34. return 0;
    35. }

  • 相关阅读:
    C++ 学习(19)STL - list容器、set容器
    一文带你搞懂环绕通知@Around与最终通知@After的实现
    Springboot整合mybatis
    阿里分布式开发小册Github新开源 原理实践双飞
    SpringMVC(三)获取请求参数
    Java学习第一课
    TSINGSEE青犀AI智能分析网关V4酿酒厂安全挂网AI检测算法
    数商云供应链系统为机械设备行业打造数据智能应用服务,助力企业智慧决策
    Cadence OrCAD Capture自动更新元件属性功能详解
    一文读懂强化学习:RL全面解析与Pytorch实战
  • 原文地址:https://blog.csdn.net/qq_61658398/article/details/133241772