当前位置:   article > 正文

C语言——数据在内存中储存(字符char、整型int、单精度浮点float)_内存中字符型数据怎么存

内存中字符型数据怎么存

一、字符型在内存中的储存

1、认识ASCII

        (American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。

        

95fd3fdaeb114c088394c01979848c2a.png

 2、ASCLL码的大小规则

常见ASCII码的大小规则:0~9<A~Z<a~z。

1)数字比字母要小。如 “7”<“F”。

2)数字0比数字9要小,并按0到9顺序递增。如 “3”<“8‘’。

3)字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z” 。

4)同个字母的大写字母比小写字母要小32。如“A”<“a” 。

 3、 认识char

        1、在计算机内部,字符类型使用一个字节(8位)存储。

        2、C 语言将其当作整数处理,所以字符类型就是宽度为一个字节的整数。

        3、每个字符对应一个整数(由 ASCII 码确定),比如A对应整数65

        5、既然是以整数形式储存,那么就存在有符号型(signed)和无符号型(unsigned)两种

        4、char 是否有符号,默认取决于编译器 有符号取值范围:(-128——127)无符号取值范围:(0 -——255) 

        当二进制最高位为0时无符号的char与有符号的char相同

        当二进制最高位为1时内存中为补码

  1. int main()
  2. {
  3. char b = 'A';
  4. printf("%d\n", b); // 打印出Ascll码值65
  5. printf("%c\n", b); // 打印字符为 A
  6. char a = -1;
  7. // 原码 10000000000000000000000000000001
  8. // 反码 11111111111111111111111111111110
  9. // 补码 11111111111111111111111111111111
  10. // 由于char类型 为1字节 8bite位 需要截断
  11. // 11111111
  12. // 所以-1在内存中储存为11111111
  13. // 打印时需整型提升 且为有符号整型
  14. // 负整数补1
  15. // 补码 11111111111111111111111111111111
  16. // 原码 10000000000000000000000000000001
  17. // -1
  18. printf("%d\n", a); // 打印出有符号值:-1
  19. // 打印时为无符号
  20. // 原反补相同 11111111111111111111111111111111
  21. printf("%u\n", a); // 打印出无符号值: 4294967295
  22. return 0;
  23. }

 

 

9c4b9d2bae324b0382503d35ff0869cd.png

 8ea0db659c5043f3a0e043a9b7e25354.jpeg

 当超出char类型范围时,char会按照图中循环方式进行储存值,本质是由整型提升导致的

二、整数类型在内存中储存形式

  1. int main()
  2. {
  3. int a = -20;
  4. //原 10000000000000000000000000010100
  5. //反 11111111111111111111111111101011
  6. //补 11111111111111111111111111101100
  7. printf("%d\n", a); // -20
  8. printf("%u\n", a); // 4294967276 打印无符号时,补码为原码
  9. unsigned int b = 10;
  10. //原 00000000000000000000000000001010
  11. // 11111111111111111111111111101100 -20
  12. // +00000000000000000000000000001010 10
  13. //补11111111111111111111111111110110 -10
  14. // 转化为原码减一变反码
  15. //反11111111111111111111111111110101
  16. //原10000000000000000000000000001010 -10
  17. printf("%d\n", a + b);// -10
  18. // 11111111111111111111111111110110 打印无符号 补码不用变原码
  19. printf("%u\n", a + b);// 4294967286
  20. return 0;
  21. }

三、浮点型在内存中的储存形式

  • (-1) ^S * M * 2 ^E

  • (-1) ^S 表示符号位 ,当s=0, V为正数;当s=1, V为负数

  • M表示有效数字,M大于等于1,小于2

  • 2^E表示指数位

27948582efda4846abdc7d34c28ef242.png

 

  1. int main()
  2. {
  3. float a = 5.5f;
  4. // 5.5 -> 十进制
  5. // 101.1 -> 二进制
  6. // 1.011 * 2^2 -> 2的2次方表示小数点往前移两位
  7. // (-1)^0 * 1.011 * 2^2 -> 二进制浮点数的表现形式
  8. // (-1)^S * M * 2 ^E
  9. // S = 0 M = 1.011 E = 2 + 127 = 129
  10. // S E M
  11. // 0 10000001 01100000000000000000000
  12. // 0100 0000 1011 0000 0000 0000 0000 0000
  13. // 8421
  14. // 40 a0 00 00 -> 8进制
  15. return 0;
  16. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/519865
推荐阅读