C语言学习笔记----奇怪的数据类型

C语言学习笔记-----奇怪的数据类型

 

前文中我们用到了 intvoid,但是void表示无类型,所以他不能来标识变量。什么是变量,字面意思就可以说明白它的特性,可以变化的量,那相对而言就有了不能变化的量常量。

那我们写下如下代码:


 

声明并且定义了一个表示整数(我们暂且这么理解)的变量,它表示0。既然是变量那我们也就可以改变它的量,比如这样:

 

 

此时的a表示的已经是1了。这个等号并不是比较的意思,而是叫做赋值,a是我们声明的一个表示整数的变量,C语言赋值语句是从右向左的,我们把01先后赋值给了a

 

那么接下来就要研究一下还有什么数据类型了,其实就根本来言,数据类型一共有四种:整型(表示整数),浮点型(表示小数),指针,复合型(由多种数据类型混杂而成的组合体,可以理解为合体金刚==)。

那么整型又包括以下几种,长整型,整型,短整型,字符型(表示二十六个字母和0~9数字和一些杂七杂八的符号,待会就说一下他为什么是整型),那么每种又分为有符号和无符号的(正负号)。不如上图:

 

那么我们先来啃完整型,其他的原理性的东西也就清楚了,首先前面一直在说int中的数字为什么有大小限制?任何数据类型的数据都是储存在内存中的,而内存是有限的……所以,数字当然是有限的。一个int要占用2个字节(与编译器有关,32位的编译器需要占用4个字节,不妨搜索以下编译器16位和32位的不同,操作系统32位和64位的区别),1个字节代表八个位,每个位代表一个二进制单元,只有01两种。

 

int如果有两个字节就代表拥有16个位,每个位有两种情况,那他们组合在一起可以表示2^16216次方)种情况,每种情况代表一个数,也就是说可以表示65536个数。那么对于有符号的数来说需要有一个位来表示正负,那也就只有2^15次方(32768)来表示数了。这样就明了了,int的范围是-32768~32767(考虑上0),那unsigned int的范围就是0~65535

 

short int long int可以写的时候省略int

 

C语言的标准文件并没有强制要求short intlong int所占的字节数。所以我在自己的IDE里这样得到它所占的字节数,

 


这样我们得到short int类型的变量在我的机器上占两个字节,那么sizeof是一个函数,它的功能就像它的名称所说的一样是xx的尺寸,括号里放的就是xx,那我把一个short类型的变量传给它,它把这个变量所占的字节数告诉了b,然后我们调用printf函数把b的值输出,printf函数内的引号部分是屏幕上显示的内容,%d用来代表输出的是一个整数变量,来代表b。这是一种用法,在后面我们会看到printf是一个很强大的函数(虽然再强大的函数随着时间流逝都会变得虚弱,被更强大的替代)。

 

那么我们可以把上面的short换成long来自己试一下long占多少字节并且来推算long的最大值和最小值。(Long并不一定比int大,short也不一定比int小。)

 

接下来就是char了,char明明表示的是字符,为什么会被一些人认为是整型呢?其实char也是一种int,不过它只占用一个字节,可以表示2^8=256个值,编译器会根据他表示的整数在ASCIIAmerican Standard Code for Information Interchange,美国信息交换标准代码)表用相应的字符替代。ASCII表可自行百度。这是一种标准信息交换码。

 

怎么说都不如实际测试哦

 

 

 

可以看见输出一个char类型的变量内存储的整数是97,那我们来看一下ASCII表,

 

 

 

97代表的值就是a!好吧没什么可惊讶的=、=

怎么输出‘a’呢我们把printf种%d换成%c就可以了,代表输出字符

编译器一看它是char类型的,就把里面的数值换成了字符读出,把字符换成数值存在里面。

 

接下来说一下浮点型。浮点型是用来表示小数的,浮点型分为单精度和双精度,从精度来看的话就知道双精度比单精度的精确度高,放在小数上讲就是双精度表示的小数点后面的位数比单精度多。

 

浮点数是不能用unsigned修饰的,是因为他在内存中的存储方式与整型不同。可以参见以下链接http://blog.163.com/xb_stone_yinyang/blog/static/2118160372013310957027/

 

果然引用链接省事多了,学会在茫茫大海中查找信息也是一门必要的功课。=、=

 

无论我们思考每一个问题的为什么,我们都可以往硬件和编译器那里想。指针是一种比较特殊的变量,它可以说是c语言中最强大的武器。这个后面再说。

 

难道就这样结束了?不,怎么可以,我们还没有恶搞呢,前面说到C语言16位编译器int类型最大值为32767,那么如果我们输入更大的数会发生什么呢?(我的编译器是cygwingcc32位的,那我的最大值也就是2^31=2147483648-1,注意有一位来表示符号了,所以是31次方,算上0,所以减去1

 

发生了有趣的事情。

 

 

未定义的行为,代表的意思是编译器怎么定义都可以,但一般编译器会把计算得到的值直接输出。比如2147483647的二进制为‭01111111111111111111111111111111,最高位0表示正的,那再加个1,结果就是‭10000000000000000000000000000000,结果是首位表示负的,对于附属计算机按照补码处理(可自行百度),那10000000000000000000000000000000表示的其实是-2147483647。

 

只测试这一个,其余各种类型的溢出可以自己试试,溢出是很害人的,写代码一定要注意。

 

字符型char只有一个字节,最多只有256种表示,这怎么能表示汉字呢?所以两个字节才能表示一个汉字。有兴趣的同学可以查阅unicode编码,世界上所有的文字都可以用它里表示。这样就可以编写可选语言的软件了,hh。

 

有些东西是互相行联系的,以我的能力没办法一次记录全,难免遗漏,所以,我打算慢慢来……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值