当前位置 : 主页 > 编程语言 > c语言 >

基础_004_数据类型及其转换

来源:互联网 收集:自由互联 发布时间:2023-09-07
一、数据类型 1、整型数据 类型 关键字 字节 数值范围 读写 基本整型 int 4 (-2 31 ~2 31 -1) %d 短整型 short int 2 -32768~32767(-2 15 ~2 15 -1) %hd 长整型 long int 4 (-2 31 ~2 31 -1) %ld 无符

一、数据类型

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、强制类型转换   

基础_004_数据类型及其转换_强制类型转换

    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】
上一篇:【C】自定义类型(一)结构体
下一篇:没有了
网友评论