C语言再学习part5—数据类型(二)
聪明秀出谓之英,胆力过人谓之雄。 --刘邵
近来我被是否就业或者继续读研深造的事情困扰着。这几天我被自己烦到想打人,但是我需要做个理智的人。我告诉自己一个大老爷们要拿得起,放得下,想不明白就先放下,等沉淀沉淀后拿起来再考虑。同时做出的决定不可以反悔,当机立断,敢想敢干才可以。或许这也是一次内心的成长吧!我其实有个很大的缺点,那就是喜欢钻牛角尖。说白了,就是心里太小,屁大的事情反复思考,拿不起放不下!这个坏毛病影响了我的高考,真的想赶走这种思维方式。但是这就是我啊!我还要继续锻炼自己让自己的心境广阔,当机立断。我的心得也送给君子了!
前天在读关于屈原的一篇文章,实在被屈原的耿直和天真感动!话不多说,哈哈,进入正题。该篇博文主要讲解的是实型变量的存放形式、字符型变量、转义字符、各种字符之间的相互转换。
第一个问题:实型变量的存放形式是怎么样的?
对于实型变量,在这里我只用float型做例子。double型存放形式与float型相似。
float型数据是利用32位的空间并按照指数的形式进行储存的。
其格式是数符 阶码(指数部分/有效数字位) 尾数(小数部分)。
注:根据规定float有效数字位为6-7位,通常取7位。即,阶码会有七位(double和long double也取有效数值最高位)。并且数符是表示阶码的正负,不代表整个数值的正负。
例如13.625的float形式储存方法
首先转换为二进制数1101.101,存放之前数据需要变成1.101101e+3的形式。注:存放时的数据必须是写成1.XXX才能进行存放,并且只有小数点之后的数才能参与存放。
接着存放时,在阶码处多加上一个最高位2^7-1=127,所以阶码处已经有了八位。注:存入时在阶码处多加入一位,是语言的规定。所以取出时也需要减去127,才能得到真是的指数位。
所以存放格式如下:
0(此处为符号位 31位) 10000010(此处为阶码位 30-23位) 10110100000000000000000(此处为尾数位22-0位,并且从高往低处排列)。
第二个问题:如何取到float型数值的最大正值呢?
当需要求得最大正值时,数值1.111111111111111111111111111(n多个1)e+8这个数才是最大数。当存放这个数值时,才能取得float最大正值,存放如下:
0 11111111 00000000000000000000000(由于float需要保存精度,所以进1后小数点后的数值都为0)。故这个数最大值为1*2^128约等于3.4E+38,。若是求float最小值则将数符位换成1,其余不动,最小值为1*2^(-128)约等于3.4E-38。记住:数符是表示阶码的正负,不是代表整个数的正负。
其中阶码部分占的位数越多,表示的值范围越大。
其中尾数部分占据的位越多,数的有效数字越多,精度越高。
第三个问题:实型数据的舍入误差是什么意思?
举个小代码,大家可以尝试运行一下就会发现数据会进位溢出现象。大家可以尝试使用上面所说的浮点数的存储方法推理一下就会明白溢出的情况是怎么发生的。尾数存在有舍有入。
int main() { float a; double b; a=33333.33333; b=33333.33333333333333; printf("%f\n%f\n",a,b); return 0; }
第四个问题:字符型数据的存放方式是什么样的??它和整型变量有什么联系??
字符型变量采用的是ACSII码的形式进行存放的。对于字符型数据来说可以把它们看成整型变量。C语言允许对整型变量赋予字符值,也允许字符变量被赋予整型值。输出时候,允许把字符变量按整型量输出,也允许把整型量按字符量输出。当整型变量为两字节时,由于字符型变量为单字节。所以当整型变量按照字符型白能量来处理时候,只有低处八位参与操作。
平常时候我们需要降低对系统内存的占用,不是特别的数就用字符型的。
第一个大发现:转义字符其实是块宝藏!
C语言字符集中的任何一个字符均可用转义字符来表示。其中\ddd 表示1~3 位八进制数所代表的字符,\xhh 1~2 位十六进制数所代表的字符。ASCII码通常使用10进制表示。举个例子,\134 134是八进制数转为十进制为92,代表是反斜杠。
第五个问题:有了各种数据之后又是怎么实现相互转换的呢?
数据之间的相互转化分为两种。一种是自动转化,另外一种是强制类型转换。
第一种:自动转换
主要核心:若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
具体的细节是:
1.转化按照数据长度增加的方向进行,以保证精度不丢失。如 int 型和 long 型运算时,先把 int 量转成 long型后再进行运算。
2.所以浮点运算的都是用双精度来计算的。即使是仅仅的float单精度数据,也会是先转换到double型再次转换。
3.char型数据和int型数据参与运算时,必须先转换为int型。
4.在赋值运算过程中,赋值号的数据类型不同时。赋值号右边量的类型会自动转化为左边的数据类型,将会丢失一部分数据,并且会四舍五入,从而来保证最大的精度范围。
如下图自动转换表,数据总是自动和等级高的匹配。例如char数据和int数据运算,char数据会先转换为int型数据。
第二种:强制类型转换
强制类型转换一般形式为 (类型说明符)(表达式)
例如: (float)a 把a转换为是实型边来那个
(int)(x+y)把x+y的结果转换为整型
注意:
1. 在使用这个表达式时,类型说明符和表达式都要加括号(单个变量可以不加括号),如果(int)x+y就变成了x转化为了int型之后与y相加了。
2.无论是强制转换还是自动转换,都只是为了本次运算的需求而对变量的数值进行改变,但是不改变数据说明时对该变量定义的类型。[1]
[1]谭浩强.C程序设计(第四版)[J].计算机教育,2010(20):114.