练习
这道题答案是啥呢?相信电视机前很多观众已经猜到答案了,答案就是 -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
第三个输出是浮点数以整型方式输出
以整型方式打印电脑则将这段二进制序列理解成整型储存方式,所以打印出来的结果是