C语言中各种基本数据类型在内存中的存储方式

整型数据:

        所有整数(正负零)在内存中都是以补码的形式存在。对于一个正整数来说,它的补码就是它的原码本身。对于一个负整数来说,它的补码为原码取反再加1。

字符型数据:

        把字符的相对应的ASCII码(整数,映射关系见ASCII码表)放到存储码单元中,而这些ASCII代码值在计算机中同样以二进制补码的形式存放的。[1]

实型数据:

       也叫浮点数, 在计算机中也是以二进制的方式存储,关键在于如何将十进制的小数转化为二进制来表示。 

例:12.63 

首先整数部分为:1100 

小数部分:0.632=1.26,得小数后第一位为1,0.262=0.52得小数的第二位为0,0.522=1.04得第三位为1,0.042=0.08得第四位为0,0.08*2得第五位,以此类推,于是得到最后的结果为1100.10100001b(省略了后面的计算)。

但是,注意,C语言中(包括C++/Java)实际存储浮点数都不是这样直接存储“整数二进制+小数二进制”就完事的,这只是第一步。转化二进制以后还要进行处理,实际的存储标准是IEEE 754,感兴趣的可以看下:

https://www.cnblogs.com/fengliu-/p/7455246.html

或者直接去查IEEE 754标准也可以。

再结合C/C++/Java,实际输出看看其二进制码是不是吻合,更好。(有空我会更新我的实验学习结果)

注意:

① 遇见一直“乘不净”的浮点数,最终能取多少位取决于编译器对应的浮点类型数据的分配字节,字节数越多越精确。故double要比float精确不仅仅是整数部分上限更高,小数部分也能取到更低的位数,故而更精确。而且,回到进制定义(跟十进制的关系),有

 1100.1010 = 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0 + 1 * 2^-1 +0 * 2^-2 +1 * 2^-3 + 0 * 2^-4

       如果一个浮点数小数部分不能表示为 a11/2 +a21/4 + a3*1/8 + … 的和形式(a可以为1或0),如0.75,  0,875,则永远“乘不净”,所以如0.1,0.2, 0.3这样如此“简单”的小数,在计算机内存存储的都是其近似值,而不可能准确表示。

    故,尽量避免大的浮点数和小浮点数运算,由于浮点数存储的特点,常常会使小的浮点数丢失且判断两个浮点数或一个浮点数和整数,常量是否相等,使用abs(x-y)<0.000001这种形式。

另外,在支持中文的环境下,中文同样是利用映射表(如GBK表),映射到16进制数(实际就是二进制数)上去存储的。

 

 

参考资料:

[1]https://www.nowcoder.com/questionTerminal/b8d34c56da1245399200555f88c5877e?orderByHotValue=1&page=1&onlyReference=false

来源:牛客网

整型数据:

猜你喜欢

转载自blog.csdn.net/gaggagaasd/article/details/100604859