Skip to content

Latest commit

 

History

History

task3

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

动态内存分配

任务编号

task3

任务目的

熟悉C/C++的语法。

掌握动态内存分配计算机内存的逻辑构造以及指针的简单用法。

任务要求

本次任务为算法题目,算法实现要求使用C/C++完成。同时还需要你提供一张原理图以证明你已经通过本次任务学会了所要求的知识。

任务时间

2017-11-12 至 2017-11-26

注: 起始时间为我们开始Review的时间,终止时间为Review的截止时间。

题目:

  1. 显示float数据的二进制形式。
  2. 动态分配内存并操作这段内存以输出这段内存的内容。

描述:

  1. 在C/C++中,float类型的数据是按照IEEE 754标准以二进制形式存储的,平时我们编写程序的时候并不能看到float类型的二进制形式,换言之它对于程序员而言是透明的。现在请你想办法输出float类型数据的十六进制形式(等价于二进制):

    提示:

    1. 思考如何用cout输出数据的二进制形式;
    2. 思考指针的实际意义,高级语言中的“类型”究竟在内存中是一个怎样的模型。

    在完成这个题目之后,请选择一个float数据,写出它的二进制形式,并按照IEEE 754的标准把每个部分代表的内容都标记出来,要求写出过程。相应的文本保存为float_binary.txt

    请注意:完成这个题目的时候,你不能使用任何现有的、可以把float数据转为16进制的库函数,仅仅允许在输出int数据的时候能够使用iostream中的hex控制符

    176.0625

    1. 将176.0625的整数部分和小数部分分别转化为二进制:

    176 =0b10110000 0.0625=0b0.0001

    1. 则176.0625的二进制为:

    0b10110000.0001;

    1. IEEE754约定小数点左边隐含1位,通常为1,因此

    0b10110000.0001=0b1.01100000001 * 2^7;

    1. IEEE754约定单精度指数偏移量为127,所以176.0625使用IEEE754标准表示时,指数偏移量为

    7+127=134=0b10000110;

    1. IEEE754约定单精度尾数长度为23,所以176.0625使用IEEE754标准表示时,尾数为

    0b01100000001000000000000;

    1. 176.0625>0,即为整数,所以符号位为0;
    2. 故使用IEEE754规格化后的表示为:

    0b|0|10000110|01100000001000000000000

  2. C语言中的malloc函数以及C++中的new操作符都能够在程序的执行过程中动态分配一段内存,动态分配内存能够让我们更加灵活地操作操作系统的内存而不必依赖于静态内存分配,同时也能节省内存。

    现在请你动态分配一段大小为64 bits的内存,并为这段内存中轮流填入相应的数据,同时用适当的操作来完成如下输出:

    第一轮: [2147483647,-2147483648]

    第二轮: [65525, 65524, 65523, 65522]

    第三轮: [-128 , 34811, 255, 4294967295 ]

    第四轮: [‘A’, "hello!\0"]

    在完成这个题目之后,请你画出你分配的这段内存的结构简图,并标识出每一轮输出时,内存的数据内容(以二进制形式分段展示)。图片保存为memory.png

  **请注意:在完成这个问题的时候,如果发生指针转换,那么你只能使用static_cast/reinterpret_cast/dynamic_cast/const_cast中的某一种,并且应当选择最合适的那一种。

示范:

1、第一题

输入:

3.14159

输出:

0x40490fd0

2、第二题

输入:

输出:

1st Round:

[2147483647,-2147483648]

2nd Round:

[65525, 65524, 65523, 65522]

3rd Round:

[-128 , 34811, 256, 4294967295 ]

4th Round:

[‘A’, "hello!\0"]

测试用例:

1、第一题

算法需满足包括但不仅限于以下测试用例。

0.88846546 -> 0x3f637279

15613.49871 -> 0x4673f5ff

2、第二题