数据类型和存储

数据类型和存储

浮点数据类型

在C和C++中的浮点分为floatdouble

这2个浮点类型的区别在于宽度,在存储方式上没有区别。

首先需要说明一点二进制是没办法表示负数的,所以负数的二进制表示有各种规范

C和C++采用的是IEEE标准,下面用一个float的例子来说明吧

  1. 先将这个实数的绝对值化为二进制格式

  2. 将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。

  3. 从小数点右边第一位开始数出二十三位数字放入第22到第0位。

  4. 如果实数是正的,则在第31位放入“0”,否则放入“1”。

  5. 如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。

  6. 如果n是左移得到的(也就是得到的指数),则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。

float i = 1.25;

首先把i转换成浮点数的二进制,首先整数部分就是0001,小数部分则是0.252=0.500.25*2=0.5···0,0.52=110.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

  1. ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。

  2. 标准 ASCII 码使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。

  3. 扩展 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是字符型,floatdouble是浮点型。通过这个例子我想其实很清楚了。int i = ‘a’ 这个代码应该足够让你感到惊讶了。除了浮点型,不论是intshortchar的区别只是宽度而已,也就是一千个读者有一千个哈姆雷特,究竟是整数还是字符,取决于你。浮点的存储跟整型不一样所以不能一概而论。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章