整数
关于整数在数据中的存储比较简单,分为有符号整数和无符号的整数,他们的存储都是转化为二进制存储,而首位是符号位,但是在无符号的整型中他不会被识别为符号位,而是当成正常的二进制位运算就会出现图中所示的情况。
我们再顺便提一嘴char类型,因为是一个字节八个比特位,所以会出现整型提升的情况,进而导致他的值可能产生一些变化,比如
按理说应该是产生129这个值,但是为什么会变成-127呢,首先由于长度限制,char最大只能到11111111,这在内存中被识别为-128,如果再+1,虽然会产生进位,但是也超过了本身八个比特位的长度,导致无法计算进去,所以char更像是一个圆,他的值在-128到127之间循环。
再根据上面char的值范围结合上原反补的转换,所以当以整型打印字符类型时会产生整型提升和截断
最后得出它为什么+2不等于129而是等于-127。
浮点数
相比起整数浮点数在内存中就有些抽象了,因为它的存储是按照国际规定的存,首先来说一下规定是什么,浮点数的计算分为三个部分S E M
首先将S乘-1 此时S如果是正数 则S=0 负数则S=1。
再假定一个浮点数9.0,他的二进制表示是1001,用科学计数法表示则是1.001乘上2的3次方,因为是二进制所以以二为底,那么1.001是M,次方3则是E。
浮点数float 32比特位里第一个比特位存的是符号位 中间八个比特位存E 最后23个比特位存M
浮点数double 64个比特位中 第一个存符号位 中间11个比特位存E 最后52个比特位存M
且M的值大于1小于2.
而由于科学计数法可以出现负数,而E不接受负数 ,所以规定了一个中间值 float的中间值是127
double的中间值则是1023 我们产生的E需要加上中间值再写入二进制 ,而M的值小数点前的1将被省略,这样将可以多存入一点数据,在转化后加上小数点前的1即可
那么它在内存中的存放其实是(假设a现在是float类型)
而如果a是整型 那么他在内存中的存放应该是
那么当我们想把一个整型的数用浮点型打印就会出现他的E全0的情况 E为0是特殊情况
此时E将等于1-127(中间值) 而M也将不加上1 这就导致明明我在整型里是个9,到浮点型里就变成了一个无限接近于0的数。
另一种特殊情况则是E全1的情况。此时如果M的有效数字全为0,则表示无穷大,至于是正无穷大还是负无穷大这取决于符号位。
所以关于浮点数的存储,难在他的存储是按照国际标准规定的,如果先弄明白他的规定,再去理解就简单一点,不过还是有的绕,需要多看几遍才能明白。