c语言的数据不同类型.docx

上传人:夺命阿水 文档编号:798205 上传时间:2023-12-01 格式:DOCX 页数:17 大小:36KB
返回 下载 相关 举报
c语言的数据不同类型.docx_第1页
第1页 / 共17页
c语言的数据不同类型.docx_第2页
第2页 / 共17页
c语言的数据不同类型.docx_第3页
第3页 / 共17页
c语言的数据不同类型.docx_第4页
第4页 / 共17页
c语言的数据不同类型.docx_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《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表示小数部分。在计算机

16、内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的XXXXXX部分。比如保存LOIB的时候,只保存OlB,等到读取的时候,再把第T立的1加上去。1将二进制的浮点数转换浮点数:指数为OlllIlOOB,对应的十进制数124,则二进制指数为124-127=-3,尾数为Oqibjjhim=i.oib浮点数值为1.01B*2(-3)=0.00101B=l8+l32=0.156252单精度浮点数转换为二进制存储:十进制数78.375=78+0.375整数十进制数78=100IllOB小数十进制数0375=38=l4+l8=2八(-2)+2(-3)=0.011B十进制数78.375=10

17、01110B+0.011B=1001110.011B=1.001110011B*(26)十进制数78.375在计算机中以二进制存储,指数为6,贝!J6+127=133=10000101B,尾数为0.001110011B因此符号为0,指数8位为1000OlOlB,尾数23位为00111001100,0000,0000,0000;单精度浮点数0.5转化二进制数十进制数0.5=0B+0.1B=0.1B=1.0B*2(-1)J+三制数0.5=l2=2(-l)=0.1B,十进制数0.5在计算机中以二进制存储,其指数为-L则-1+127=126=0111IIIoB,尾数为0.0B,因此符号为0,指数8位为

18、OlIIIllOB尾数23位为OOO,0000,0000,OoOOQoOO,0000;3双精度浮点数转换为二进制存储:double类型使用64比特存储,1位符号位,11位指数位,52位尾数位。十进制数78.375=78+0.375,整数十进制数78=10011IOB,小数十进制数0.375=38=14+18=2(-2)+2(-3)=0.011B十进制数78.375=1001110B+0.011B=1001110.011B=1.001110011B*(26),十进制数78.375在计算机中以二进制存储,指数为6,则6+1023=1029=10000000101B尾数为0.0011100IIB,因

19、此符号为0指数11位为1000000OlOlB,尾数52位为001110011000z0000z0000z0000z0000z0000z0000z0000z0000z0000zOOOO;双精度浮点数0.5转化二进制数十进制数0.5=00.5,整数十进制数O=OB,小数十进制数0.5=l2=2(-l)=0.1B,十进制数0.5=0B+0.1B=0.1B=1.0B*2(-l)o十进制数0.5在计算机中以二进制存储,其指数为-1,占11位,则-1+1023=1022=11IlllIllOB,尾数为0.0B,因此符号为0,指数11位为11IlllIllOB,尾数52位为OoOO,0000,0000,0

20、000,0000,0000,0000,0000,0000,0000,0000,0000z0000;单精度浮点数0.0转化二进制数浮点数0的尾数M=LOOO,0000,0000,0000,0000,00OOB为了表示近似等于0,就使用1.OooQOOO,0000,0000,0000,0000B*2(-127)来表示;相当于把远端的1移动过来,所以指数为-127。浮点数O的指数为127+127=00000000B,尾数为Ooo,0000,0000,0000,0000,00OOB,因此符号为0,指数8位为00000000Bo尾数23位为000,0000,0000,0000z0000,0000Bo双精

21、度浮点数0.0转化二进制数浮点数0的尾数M=LOOOo,0000,0000,0000,0000,0000,0000,0000,0000,000(WOO,0000,0000B,为了表示近似等于0,就使用1.OOOO,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000z0000B*2(-1023)来表示;浮点数0的指数为-1023+1023=000,0000,0000B,浮点数0的尾数为0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,000OzOOOOB7因此符号为0,指数11位

22、为OOO,0000,00OOB,尾数52位为OOoo,0000,0000,0000,0000,0000,0000,0000,OOOOQOoOQOoO,0000z0000Bo十进制整数转换为二进制整数:采用除2取余,逆序排列法。十进制小数转换成二进制小数:采用乘2取整,顺序排列法。(1) float型(单精度浮点型)。编译系统为每一个float型变量分配4个字节,数值以规范化的二进制数指数形式存放在存储单元中。在存储时,系统将实型数据分成小数部分和指数部分两个部分分别存放。小数部分的小数点前面的数为Oo如3.14159在内存中的存放形式:数符小数部分+指数。在计算机中是用二进制数来表示小数部分以

23、及用2的鬲次来表示指数部分的。在4个字节(32位)中,究竟用多少位来表示小数部分,多少位来表示指数部分。有的C语言编译系统以24位表示小数部分(包括符号),以8位表示指数部分(包括指数的符号)o由于用二进制形式表示一个实数以及存储单元的长度是有限的,因此不可能得到完全精确的值,只能存储成有限的精确度。小数部分占的位(bit)数愈多,数的有效数字愈多,精度也就愈高。指数部分占的位数愈多,则能表示的数值范围愈大。float型数据能得到6位有效数字,数值范围为34X10八(-38)3.4x10人38。(2) double型(双精度浮点型)。为了扩大能表示的数值范围,用8个字节存储一个double型数

24、据,可以得到15位有效数字,数值范围为-1.7XlOA-308L7l0八308。为了提高运算精度,在C语言中进行浮点数的算术运算时将float型数据都自动转换为d。Uble型,然后进行运算。(3) longdouble型(长双精度)型,不同的编译系统对longdouble型的处理方法不同,TurboC对longdouble型分配16个字节。而VisualC+则对longdouble型和double是一样处理,分配8个字节。(四)确定常量的类型在C语言中,不仅变量有类型,常量也有类型。在程序中出现的常量是要存放在计算机中的存储单元中的。这就必须确定分配给它多少字节,按什么方式存储。例如,程序中有

25、整数12,在VisualC中会分配给它4个字节,按补码方式存储。确定常量的类型从常量的表示形式即可以判定其类型。对于字符常量只要看到由单撇号括起来的单个字符或转义字符就可以知道它是字符常量。对于数值常量按以下规律判断:整型常量:不带小数点的数值是整型常量,但应注意其有效范围。如在TurboC中,系统为整型数据分配2个字节,其表值范围为-3276832767,如果在程序中出现数值常量23456,系统把它作为int型处理,用2个字节存放。如果出现49875,由于超过32767,2个字节放不下,系统会把它作为长整型(longint)处理,分配4个字节。VisualC+中,在范围-2147483648

26、2147483647的不带小数点的数都作为int型分配4个字节在此范围外而又在longlong型数的范围内的整数,作为longlong型处理。在一个整数末尾加大写字母L或小写I,表示它是长整型,例如123L。但在VisualC+中由于对int和IOngim型数据都分配4个字节,因此没有必要用longint型。浮点型常量凡以小数形式或指数形式出现的实数均是浮点型常量,在内存中都以指数形式存储。如,10是整型常量,10.0是浮点型常量。C编译系统把浮点型常量都按双精度处理,分配8个字节。如果有floata=3.14159;在进行编译时,对float变量分配4个字节,但对于浮点型常量3.14159,

27、则按双精度处理,分配8个字节。编译系统会发出警告(warning:truncationfrom,constdouble,to/float)o意为把一个双精度常量转换为float型,提醒用户注意这种转换可能损失精度。这样的警告,一般不会影响程序运行结果的正确性,但会影响程序运行结果的精确度。可以在常量的末尾加专用字符,强制指定常量的类型。如在3.14159后面加字母F或f就表示是float型常量,分配4个字节。如果在实型常量后面加大写或小写的L,则指定此常量为longdouble型。如:floata=3.14159f;把此3.14159按单精度浮点常量处理,编译时不出现警告longdoublea=L23L;把此1.23作为longdouble型处理。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号