《c语言的数据不同类型.docx》由会员分享,可在线阅读,更多相关《c语言的数据不同类型.docx(17页珍藏版)》请在优知文库上搜索。
1、C语言的数据不同类型不同类型的数据在内存中占用的存储单元长度是不同的,例如,VisualC+为char(字符型)数据分配1个字节,对int型(基本整型)数据分配4个字节,存储不同类型数据方法也是不同的。(一)整型数据1整型数据的分类(1)基本整型(int型)编译系统分配给int型数据2个字节或4个字节(由具体的C编译系统自行决定)。如TurboC2.0为每一个整型数据分配2个字节(16位),而VisualC为每一个整型数据分配4个字节(32位)。在存储单元中的存储方式是:用整数的补码形式存放。一个正数的补码是此数的二进制形式本身,补全2个字节16位码,如5的二进制形式是101,如果用两个字节存
2、放一个整数,则在存储单元中数据形式是00000000-00000101;如果是一个负数,应先求出负数的补码。负数的补码的方法是:先将此数的绝对值写成二进制形式,然后对其所有二进位按位取反,再加Io如-5的补码:5的原码按位取反11111111-11111010,再加1-5的补码为11111111-11111011在存放整数的存储单元中,最左面一位是用来表示数的正负符号的。如果该位为0表示数值为正;如果该位为1,表示数值为负。如果给整型变量分配2个字节,则存储单元中能存放的最大值为01111111-11111111,第1位为0代表正数,后面15位为全1,此数值是215-1)即十进制数32767。
3、最小值为10000000-00000000,此数是-2八15,SP-32768o因此2个字节的一个整型变量的值的范围是-32768327670超过此范围,就出现数值的溢出,输出的结果显然不正确。(2)短整型(shortint)类型名为shortint或shorto如用VisualC+,编译系统分配给int数据4个字节,短整型2个字节。存储方式与int型相同。一个短整型变量的值的范围是3276832767。类型名为longint或longoVisualC+对一个long型数据分配4个字节(即32位)因此longint型变量的值的范围是-2八31-(231-1),BP-21474836482147
4、483647o(4)双长整型(longlongint)类型名为longlongint或longlong,一般分配8个字节。C标准只要求long型数据长度不短于int型,short型不长于int型。SPsizeof(short)sizeof(int)sizeof(long)sizeof(longlong),sizeof是测量类型或变量长度的运算符。在TurboC2.0中,int型和short型数据都是2个字节(16位),而long型数据是4个宇节(32位)。通常的做法是:把long定为32位,把short定为16位,而int可以是16位,也可以是32位,由编译系统决定。在将一个程序从A系统移到B
5、系统时,需要注意这个区别。例如:在A系统,整型数据占4个宇节,程序中将整数50000赋给整型变量price是合法的,可行的。但在B系统,整型数据占2个字节,将整数50000赋给整型变量(范围-3276832767),超过整型数据的范围,出现溢出。这时应当把int型变量改为long型,才能得到正确的结果。变量值在存储单元中都是以补码形式存储的,存储单元中的第1个二进位制代表符号。整型变量的值的范围包括负数到正数。整型数据常见的存储空间和值的范围(VisualC+的安排)类型/字节数/取值范围int(基本整型)/4字节/-21474836482147483647,即-2八31(2八31-1)uns
6、ignedint(无符号基本整型)4字节/即0(231-1)short(短整型)2字节,-32768-32767,即-215-(215-1)unsignedshort(无符号短整型)2个字节,0-65535,即0-(216-1)long(长整型)4字节,-21474836482147483647,即-2八31(2八31-1)unsignedlong(无符号长整型)4字节,0-4294967295,即0(232-1)longlong(双长型)8字节,-9223372036854775808-9223372036854775807,即-2八63(263-1)unsignedlonglong(无符号
7、双长整型),8字节018446744073709551615,BP0-(264-1)在实际应用中,有的数据的范围常常只有正值(如库存量等)。为了允分利用变量的值的范围,可以将变量定义为无符号类型。可以在类型符号前面加上修饰符unsigned,表示指定该变量是无符号整数类型。如果加上修饰符signed,则是有符号类型。因此,在以上4种整型数据的基础上可以扩展为以下8种整型数据:有符号基本整型signedint无符号基本整型unsignedint有符号短整型signedshortint无符号短整型unsignedshortint有符号长整型signedlongint无符号长整型unsignedlo
8、ngint无符号双长整型unsignedlonglongint方括号表示其中的内容是可选的,既可以有,也可以没有。如果既未指定为signed也未指定为unsigned的,默认为有符号类型。如signedinta和inta寄介。有符号整型数据存储单元中最高位代表数值的符号(0为正,1为负)。如果指定unsigned(为无符号)型,存储单元中全部二进位(b)都用作存放数值本身,而没有符号。无符号型变量只能存放不带符号的整数,如123,而不能存放负数。如-123。由于左面最高位不再用来表示符号,而用来表示数值,因此无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大如果在程序中定义a和
9、b两个短整型变量(占2个字节),其中b为无符号短整型shorta;/a为有符号短整型变量unsignedshortb;/b为无符号短整型变量则变量a的数值范围为-3276832767,而变量b的数值范围为0655350(1)只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。(2)对无符号整型数据用%u格式输出。%u表示用无符号十进制数的格式输出。如:unsignedshortprice=50;定义price为无符号短整型变量。printf(n%u,price);指定用无符号十进制数的格式输出在将一个变量定义为无符号整型后,不应向它赋予一个负值,否则会得至!J
10、错误的结果。如:UnSignedShortPriCe=-1;不能把一个负整数存储在无符号变量中。printf(n%dn,price),得到结果为65535o显然与原意不符。原因是:系统对先转换成补码形式,就是全部二进位都是1,然后把它存入变量price中。由于price是无符号短整型变量,按其左面第一位不代表符号,按%d格式输出,就是65535。(二)字符型数据由于字符是按其代码(整数)形式存储的。1字符与字符代码字符与字符代码并不是任意写一个字符,程序都能识别的。例如代表圆周率的开在程序中是不能识别的,只能使用系统的字符集中的字符,目前大多数系统采用ASCII字符集各种字符集(包括ASCII
11、字符集)的基本集都包括了127个字符。其中包括:字母:大写英文字母AZ,小写英文字母aZ。数字:09。专门符号:29个,包括!#&()*十,一,/:;?_(!)-空格符:空格、水平制表符、垂直制表符、换行、换页。不能显示的字符:空(null)字符(以0表示)、警告(以a表示)、退格(以b示)、回车(以r表示)等。字符是以整数形式(字符的ASCII代码)存放在内存单元中的。如:小写字母的ASCII代码是十进制数97二进制形式为IIOoOo1。转义字符n的ASCII代码是十进制数10二进制形式为OOOIO100以上字符的ASCII代码最多用7个二进位就可以表示。所有127个字符可以用7个二进位表示
12、,当ASCii代码为127时,为1111111,所以在c语言中,指定用一个字节(8位)存储一个字符(所有系统都不例外)。此时,字节中的第1位置为Oo如小写字母a在内存中的存储二进制数为Ol100OOl,因为aASCIl代码是十进制数97。注意:宇符1和整数1是不同的概念。字符,1只是代表一个形状为1的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占用1个字节,而整数1是以整数存储方由二进制补码方式存储的,占2个或4个字节。整数运算1十1等于整数2,而字符1+1并不等于整数2或字符12o2字符变量字符变量是用类型符char定义字符变量。如:chare=?;定义e为字符型变量并使初值为
13、字符。?的ASCII代码是63,系统把整数63赋给变量eoe是字符变量,实质上是一个字节的整型变量,由于它常用来存放字符,所以称为字符变量。可以把0127之间的整数赋给一个字符变量。在输出字符变量的值时,可以选择以十进制整数形式输出,或以字符形式输出。如:printf(%d%cnze,e),输出结果是63?。用%d格式输出十进制整数63,用%c格式输出字符?O整型变量可以用signed和unsigned修饰符表示符号属性。字符类型也属于整型,也可以用signed和unsigned修饰符。字符型数据的存储空间和值的范围类型/字节数/取值范围signedchar(有符号字符型)1字节,-12812
14、7,即-28(2A8-1)unsignedchar(无符号字符型)1字节,O2八8-1,在使用有符号字符型变量时,允许存储的值为-128127,但字符的代码不可能为负值,所以在存储字符时实际上只用到O127这一部分,其第一位均为Oo(三)浮点型数据浮点型数据是用来表示具有小数点的实数的。在C语言中,实数是以指数形式存放在存储单元中的。一个实数表示为指数可以有不止一种形式如3.14159可以表示为3.14159100;0.0314159102,314.159X10(-2)等,它们代表同一个值。可以看到:小数点的位置是可以在314159几个数字之间、之前或之后(力口0)浮动的,只要在小数点位置浮动
15、的同时就改变指数的值,可以保证它的值不会改变。由于小数点位置可以浮动,所以实数的指数形式称为浮点数。浮点数类型包括float(单精度浮点型)、double(双精度浮点型)、longdouble(长双精度浮点型。浮点数转换为二进制存储单精度float类型使用32比特存储,其中1位表示符号,8位表示指数,23位表示尾数;双精度double类型使用64比特存储,1位符号位,H位指数位,52位尾数位。尾数:M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是2M0对有效数字M和指数E,还有一些特别规定。1M2,也就是说,M可以写成l.xxxxxx的形式,其中xxxxxx表示小数部分。在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的XXXXXX部分。比如保存LOIB的时候,只保存OlB,等到读取的时候,再把第T立的1加上去。1将二进制的浮点数转换浮点数:指数为OlllIlOOB,对应的十进制数124,则二进制指数为124-127=-3,尾数为Oqibjjhim=i.oib浮点数值为1.01B*2(-3)=0.0