数据类型和存储
浮点数据类型
在C和C++中的浮点分为float和double。
这2个浮点类型的区别在于宽度,在存储方式上没有区别。
首先需要说明一点二进制是没办法表示负数的,所以负数的二进制表示有各种规范。
C和C++采用的是IEEE标准,下面用一个float的例子来说明吧
-
先将这个实数的绝对值化为二进制格式
-
将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
-
从小数点右边第一位开始数出二十三位数字放入第22到第0位。
-
如果实数是正的,则在第31位放入“0”,否则放入“1”。
-
如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。
-
如果n是左移得到的(也就是得到的指数),则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。
float i = 1.25;
首先把i转换成浮点数的二进制,首先整数部分就是0001,小数部分则是 0.25 ∗ 2 = 0.5 ⋅ ⋅ ⋅ 0 0.25*2=0.5···0 0.25∗2=0.5⋅⋅⋅0, 0.5 ∗ 2 = 1 ⋅ ⋅ ⋅ 1 0.5*2=1···1 0.5∗2=1⋅⋅⋅1。取商的整数部分,然后顺序排列01。那么这个二进制就表示出来了是1.01。
符号位(31) | 指数部分(30-23)8位 | 尾数部分(22-0)23位 |
---|---|---|
正数0,负数1 | 根据第5条n=0,30位为0 第6条指数n=0,减去1是-1 转为2进制11111111,取后7位 | 存储小数点后的位数,不够23位补0 |
0 | 0(30)1111111(29-23) | 01000000000000000000000(22-0) |
得到了这一串二进制数就是i在电脑中存储的样子了,在汇编中会被转成16进制便于查看。
double跟float的区别只是更加精确而已,存储是一样的,就是补的位数更多了而已。至于不会把10进制负数转成2进制的可以看看这个回答十进制负数怎么转化为二进制
PS
指数部分网上大多数是这样说的,float类型是元数据+127(1111111)后转成2进制,double类型则是元数据+1023(1111111111)后转成2进制。不管哪种说法结果都是一样的.
ASCII
-
ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。
-
标准 ASCII 码使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。
-
扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。
标准ASCII码可参见百度百科
汉字编码标准也在其中有介绍
一个关于数据存储的小例子
#include<stdio.h>
int main()
{
int i = 'a';//mov dword ptr [i],61h
float m = 1.2;//mov dword ptr [m],1
printf("%c\n", i);
printf("%d\n", i);
}
/*OutPut
a
97
*/
在初学C的时候,我想大多数都是说int是整型,short是短整型,char是字符型,float、double是浮点型。通过这个例子我想其实很清楚了。int i = ‘a’ 这个代码应该足够让你感到惊讶了。除了浮点型,不论是int,short,char的区别只是宽度而已,也就是一千个读者有一千个哈姆雷特,究竟是整数还是字符,取决于你。浮点的存储跟整型不一样所以不能一概而论。