练习+浮点型在内存中存储

本文探讨了数据类型转换过程中可能出现的截断现象,以-1、-128为例解释了有符号与无符号类型的差异,并通过一个例子展示了无符号整数在递减过程中的循环特性。此外,详细解析了浮点数在内存中的存储方式,包括IEEE754标准以及浮点数转换为整型和整型转换为浮点数的过程。通过对一段代码的分析,揭示了浮点数在不同上下文中的打印结果。
摘要由CSDN通过智能技术生成

练习

这道题答案是啥呢?相信电视机前很多观众已经猜到答案了,答案就是 -1; -1; 255;那么为什么是这个答案呢?我们一起来分析一下。

首先-1占4个字节,而char类型只开辟1个字节,这里自然需要发生截断

 可见若有符号则最后输出的是-1,

无符号则输出2^8 - 1 = 255 

这道题-128显然是 8个字节放入char仍然要发生截断,

与上一题相同截断后补位

这里的运算是按照补码方式进行的 ,直接算就好了

 

 这里我们看到在之后打印的是一个很大的数字,这是为啥呢?

你想呀,i是一个无符号数,他有负数吗?他没有呀,所以当i等于零时再减减会变成啥呢?我们就得从根源上找答案了

从这里我们可以看出i 为零,i-- 后变成-1,但是由于unsigned 的原因,-1的符号位不会起到符号位的作用,会参与计算,如示

 再减减 减减 减减, 一直减减又会减到0;所以这是一个循环。

 

 

你猜猜这道题输出什么? 想好了吗?我们先来看看答案。

 

为什么会输出255呢?这里我们就得谈到strlen这个函数了。

我们都知道strlen函数是用来计算字符串长度的,同时strlen函数遇到 ‘\0'就会停止计算,在字符数组中放入0相当于 '\0'。好,那么我们再回来看这道题,这道题因为是整型放到char中自然要发生截断

 

 

 减255次就变成0了,完事。

浮点数在内存中存储方式

 我们先来看这一段代码,这段代码显然有四个输出值,那它们分别是什么呢?我们来分析一下

第一个输出:以整形的方式放入,以整形的方式打印,结果应该是9.

第二个输出:pfloat是float类型的指针,它指向n

第三个输出:*float里面存储了9.0这个浮点数,但是要以整型方式打印

第四个输出:以浮点数方式打印浮点数

这个问题答案到底是多少呢?

我们先来看看浮点数在内存中到底是怎么存储的把

这里有个标准,这个标准就是说一个浮点数的二进制一定可以表示成(-1)^ S * M * 2 ^ E这样的形式,以8.5为例来解释一下

 

 这个标准还介绍了详细的存储方式

 

 

这里有两个需要注意的点,那就是对于M来说,因为他的取值一定在 >= 1 && < 2;所以我们可以把M的第一位1舍去,等取出数据时再加上,这样可以增大能存储的数据

 然后是关于E, E是一个unsigned int,这意味着它的取值范围是0 - 255,但是实际上,E是有负值的,所以这个标准他就规定了,E存进内存的时候需要加上127,这样E就可以是负数了

所以对上面的8.5来说,如果是float类型,则内存中存储的是 

 接下来是浮点数的取出

 

好的现在我们回去看开始那道题 

 

这是9的补码,第一个输出打印9没毛病。但是第二个输出是以浮点数形式打印,那么电脑会把9的二进制序列理解成浮点数存储形式,即:

 打印出来的就是 (-1)^ 0 *  0.0000000000000001001,又因为默认打印六位小数,所以打印结果是0.000000

第三个输出是浮点数以整型方式输出

 

 

以整型方式打印电脑则将这段二进制序列理解成整型储存方式,所以打印出来的结果是 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值