所有整数(正负零)在内存中都是以补码的形式存在。对于一个正整数来说,它的补码就是它的原码本身。对于一个负整数来说,它的补码为原码取反再加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进制数(实际就是二进制数)上去存储的。
参考资料:
来源:牛客网