一、数据类型
1、整型数据
类型
关键字
字节
数值范围
读写
基本整型
int
4
(-231~231-1)
%d
短整型
short int
2
-32768~32767(-215~215-1)
%hd
长整型
long int
4
(-231~231-1)
%ld
无符号基本整型
unsigned int
4
(0~232-1)
%u
无符号短整型
unsigned short
2
0~65535(0~216-1)
%hu
无符号长整型
unsigned long
4
(0~232-1)
%lu
注:在TC2.0中,int型数据在内存中存储占用2字节。以上为Dev-C++和Microsoft Visual C++ 2010 Express中的使用情况。此外,还有long long型数据,在内存中存储占用8字节,因为使用较少,此处不再介绍。
2、字符型数据
类型
关键字
字节
数值范围
读写
有符号字符型
char
1
-128~127(-27~27-1)
%c
无符号字符型
unsigned char
1
0~255(0~28-1)
%c
字符型数据输出字符时采用%c,计算或输出数值时采用其对应ASCII码转数值操作。
注:整型和字符型数据加粗的数据取值范围要能背记,并能熟练转换二进制,方便强制类型转换时的分析。
3、整型和字符型数据的存储
整型和字符型数据严格说来都是用补码来存储,但是因为正数的原码,反码,补码全部一致,因此,可以用下面的方式简单理解其存储:
正数:原码
负数:补码(反码+1)
对于负数,存储和读取都采用取反加1的方式,方便理解。
例题:(以下数据假定采用2字节存储)
(318)→存储和读取都用原码,即256+32+16+8+4+2→(0 000 0001 0011 1110)2
(-318)→存储,将318取反+1,符号位为1→(1 111 1110 1100 0010)2
(1 111 1111 1101 1110)2 →读取,将左侧数据取反+1,符号为负→(-34)
4、浮点型数据
类型
关键字
字节
数值范围
读写
单精度浮点型
float
4
±(-10-38~1038)
%f
双精度浮点型
double
8
±(10-308~10308)
%lf
注:关于浮点型数据的存储,请参考博客文章《基础_005_扩展_浮点型数据的存储》。此外,还有long double型数据,在内存中存储占用16字节,因为使用较少,此处不再介绍。
5、常量数据类型的确定
23为int(4),4.6为double(8),
123L为long int(8),123u为unsigned int(4),
4.6F为float(4),4.6L为long double(16)
二、数据类型转换
1、强制类型转换
short、char、float的数据类型不能为最终结果。
转换原则是“由低向高”。
2、符号扩展
长型数据→短型数据:截取低位
短型数据→长型数据:符号扩展(即根据短型数据的数据类型扩展符号位)
即有符号数按照符号位扩展,无符号数扩展0
先符号扩展再运算。
3、强制类型转换与符号扩展综合应用
例题1:
short int a=-1;
int b=1,c;
c=(a+b)/2;
printf("c=%d",c);
分析:
short int a=-1
1111 1111 1111 1111(即将-1的补码存入)
int b=1
0000 0000 0000 0000 0000 0000 0000 0001
a+b进行加法运算,结果为int型,故将a进行符号扩展后再相加。
a进行符号扩展
1111 1111 1111 1111 1111 1111 1111 1111
a+b结果
1 0000 0000 0000 0000 0000 0000 0000 0000
因int型数据只能存储32位,溢出,故将舍弃1,最终结果为0。
(a+b)/2仍然为0,因此输出为0。
例题2:
unsigned short int a=-1;
short int b=1,c;
c=(a+b)/2;
printf("c=%d",c);
分析:
unsigned short int a=-1
1111 1111 1111 1111(即将-1的补码存入)
short int b=1
0000 0000 0000 0001
a+b进行加法运算,结果为int型,因a是无符号数,扩展0;b按照符号位扩展。
a进行符号扩展
0000 0000 00000000 1111 1111 1111 1111
b进行符号扩展
0000 0000 00000000 0000 0000 0000 0001
a+b结果
0000 00000000 0001 0000 0000 0000 0000
(a+b)/2
00000000 0000 0000 1000 0000 0000 0000
因为c为short int,因此要将(a+b)/2的结果截取低16位给c。
c
10000000 0000 0000
c按照%d打印,即按照int型打印,将再次进行符号扩展,此时c为有符号数,因此扩展符号位。此时要注意与第一次扩展的不同。
printf("c=%d",c)
1111 1111 1111 1111 1000 0000 00000000
上述补码按照规则取反加1后,读取结果为-32768。
例题3:
unsigned short int a=-1;
unsigned short int b=1,c;
c=(a+b)/2;
printf("c=%d",c);
分析:
unsigned short int a=-1
1111 1111 1111 1111(即将-1的补码存入)
unsigned short int b=1
0000 0000 0000 0001
a+b进行加法运算,结果为int型,因a和b都是无符号数,故直接扩展0即可。
a进行符号扩展
0000 0000 00000000 1111 1111 1111 1111
b进行符号扩展
0000 0000 00000000 0000 0000 0000 0001
a+b结果
0000 00000000 0001 0000 0000 0000 0000
(a+b)/2
00000000 0000 0000 1000 0000 0000 0000
因为c为unsigned short int,因此要将(a+b)/2的结果截取低16位给c 。
c
1000 0000 0000 0000
c按照%d打印,即按照int型打印,将再次进行符号扩展,此时c为无符号数,扩展0。这是与例题2不同之处。
printf("c=%d",c)
0000 0000 0000 0000 1000 0000 0000 0000
上述数据读取结果为32768。
小结:
不同类型数据运算,先确定结果类型,然后扩展符号位再运算。
打印结果时,也存在数据类型转换。
比较3个例题间的不同,强化理解。
【转自:东台网页设计公司 http://www.1234xp.com/dongtai.html 复制请保留原URL】