数据在内存中的存储

目录

1.存储的数据类型

  (1) 整型

  (2) 浮点型

  (3) 构造型

  (4) 指针型

  (5) 空型

2.整型数据在内存中的存储

  (1) 原码、反码、补码

  (2) 大端、小端字节序

    例子:

Ⅰ 大端字节序

Ⅱ 小端字节序

  (3) 练习题

一、

二、

三、 

四、

五、

六、

七、

  (4) 练习题总结

3.浮点型数据在内存中的存储

  (1) 例子

  (2) 存储方式

Ⅰ E不全为0或不全为1

Ⅱ E全为0

Ⅲ E全为1

  (3) 回顾例子


1.存储的数据类型


  (1) 整型

    1.char                 1 byte
    2.short (int)         2 byte
    3.int                    4 byte    
    4.long (int)          4 byte 
      注:1.以上类型还可以衍生出 signed 与 unsigned 的版本。若无修饰,编译器一般默认为signed 类型。
             2.signed/unsigned 只能修饰整型。
             3.关于 char 是否默认为 signed,C语言并没有规定,其取决于编译器。同时,ASCⅡ码 码的范围是0~127,表示字符无需负数,故一般为 signed。


  (2) 浮点型

    1.float                  4 byte
    2.double              8 byte
    3.long double     16 byte 


  (3) 构造型

    1.数组
    2.结构体类型 struct
    3.枚举类型 enum
    4.联合类型 union


  (4) 指针型

    1.float                  4 byte
    2.double              8 byte
    3.long double     16 byte 


  (5) 空型

void,常用于函数的参数、返回类型、指针类型。


2.整型数据在内存中的存储


  (1) 原码、反码、补码


    计算机中以补码的形式对整型数据进行操作与存储。
    补码的优势:
                        1.可以将符号位和数值域进行统一处理
                        2.加法和减法可以统一处理(故CPU只有加法器)
                        3.补码和原码的运算过程是相同的,不需要额外的硬件电路
    而原码和反码的存在则是给补码的计算提供了一种方式。  


  (2) 大端、小端字节序

    例子:

 

 可实际上a的补码为FF FF FF F6,顺序不对,为什么?
        这涉及到字节的存储顺序。
        在计算机中,我们以字节为单位进行存储。以 int 为例,int 占4个字节,所以计算机在存储数据的过程中会把这4个字节按照一定的顺序进行存储。实际上,存储顺序并不重要,重要的是如何正确地将数据取出。为了简便,一般的存储方式分为大端字节序和小端字节序。


Ⅰ 大端字节序


      存储模式:数据的低位字节存储在内存的高地址处, 高位字节存储在内存的低地址处。

      KEIL C51采用大端字节序。

Ⅱ 小端字节序


      存储模式:数据的高位字节存储在内存的高地址处, 低位字节存储在内存的低地址处。

     X86结构以及多数ARM、DSP采用小端字节序。

  (3) 练习题
一、

二、

三、 

 

四、

五、

                                                                 这是一个死循环

六、

 

七、

                                                            这也是一个死循环 

  (4) 练习题总结

      1.题目的核心考点是强制类型转换时的数据截断和符号扩展。
      2.本质上仍是对补码的操作与运算。
      3.所有的数据类型均满足轮回,计算时需注意数据类型的范围。

3.浮点型数据在内存中的存储


  (1) 例子

 

由此可见,浮点型数据与整型数据的存储方式不一样。

  (2) 存储方式

      根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数 V 可以表达为以下形式:
                 V == (-1)^S * M * 2^E
      说明:(以 float 为例)
                 1.S表示符号位,当S为1时表示负数,当S为0时表示正数,占1bit。
                 2.M表示尾数,即小数点后的数字,0 ≤ M < 1,占23bit。同时,由于本质为科学计数法,所以小数点前有一个省略的1,则实际M的有效位有24位。
                 3.E表示指数,为无符号整型,占8bit。

 double 存储结构如下:

 另外,将E从内存中取出还可以分成三种情况:


Ⅰ E不全为0或不全为1


          此时,E的实际值为E-127 (1023)(因为E为一个无符号整型,但是指数可以出现负数,为了覆盖到负数的情况,将真实E的值加上127存入内存)
          例子:

    由于 0.5 == (-1)^0 * 1 * 2^-1
    所以 S=0,M=0,E=-1+127=126
    则 0.5 表示为 0 01111110 00000000000000000000000 == 0x 3F 00 00 00。

Ⅱ E全为0

    此时,E = 1-127 (1023) = -126 (-1022)
    有效数字M不再加上小数点前的1,而是表示为 0.xxxxxx 形式的小数
    M的表示情况不变
    这样是为了表示±0,以及接近于0的很小的数字。


Ⅲ E全为1

    此时,如果有效数字M全为0,则表示 ±∞  

  (3) 回顾例子

    第一次 * f = 00000000 00000000 00000000 00001001
    由于 float 只表示小数点后6位,故表示为 0.000000。
    第二次 * f = 9 = (-1)^0 * 001* 2^(3) = 0 10000010 00100000000000000000000
    转化为整型即为 1091567616。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值