数据类型

1、整型

①所占位数
除了char型在C语言中明确占一个字节外,其他类型的整型变量所占位数都是Implemention Defined。通常的编译器实现遵守ILP32或LP64

数据类型_第1张图片
Paste_Image.png

ILP32指的是int、long、和指针p占32位,32位机器通常采用这个标准;
LP64指的是Long、指针Point占64位,64位机器通常采用这个标准;

②整型常量

数据类型_第2张图片
Paste_Image.png

Note: 可见如果不发生溢出,整型常量的值总是 非负数。如果前面出现‘-’号,则是对整型常量使用的一元运算符(2 w-1),而不是整型常量的一部分。整型常量的实际类型取决于长度、基数、后缀字母和C语言实现确定的类型表示精度。具体的根据上表来确定。

2、浮点型

①所占位数
C标准规定的浮点型有 float 、 double 、 long double ,和整数类型一样,没有规定其具体占多少字节。x86处理器通常是有浮点运算单元的,遵循IEEE 754, float 型通常是32位, double 型通常是64位。
②浮点型常量
浮点数也可以加一个后缀,例如3.14f、.01L,浮点数的后缀和类型之间的对应关系比较简单,没有后缀的
浮点数常量是 double 型的,有后缀f或F的浮点数常量是 float 型的,有后缀l或L的浮点数常量是 long double 型的。

3、扩展一个数字的位表示

将一个较小的数据类型转换为一个较大的数据类型有两种扩展方式:符号扩展和零扩展。
符号扩展:将需要扩展的位数全部用符号位进行填充;
零扩展:将要扩展的位数全部用0进行填充;
有符号数向其它类型数据转化(如char到int,char到unsigned int)时,进行符号位扩展;无符号数向其它类型转换(如unsigned char到int, long)时,进行零扩展。
Demo:

#include  

int main()   

{ 

int i =129; 

char chA= (char)i; 

int c = (int)(unsigned char)chA; 

int b = (int)chA; 

printf("sign extension: %d/n",b); 

printf("zero extension: %d/n",c);  

system("pause"); 

return 1;   

} 

运行结果:

sign extension: -127
zero extension: 129
4、类型转换

同一句语句或表达式如果使用了多种类型的变量和常量(类型混用),C 会自动把它们转换成同一种类型。以下是自动类型转换的基本规则:

  1. 在表达式中,char 和 short 类型的值,无论有符号还是无符号,都会自动转换成 int 或者 unsigned int(如果 short 的大小和 int 一样,unsigned short 的表示范围就大于 int,在这种情况下,unsigned short 被转换成 unsigned int)。因为它们被转换成表示范围更大的类型,故而把这种转换整数提升(Integer Promotion)。
  2. 按照从高到低的顺序给各种数据类型分等级,依次为:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。这里有一个小小的例外,如果 long 和 int 大小相同,则 unsigned int 的等级应位于 long 之上。char 和 short 并没有出现于这个等级列表,是因为它们应该已经被升级成了 int 或者 unsigned int。
  3. 在任何涉及两种数据类型的操作中,它们之间等级较低的类型会被转换成等级较高的类型。对于单目运算符+ - ~只有一个操作数,移位运算符<< >>两边的操作数类型不要求一致,只要做整数提升就可以了。
  4. 在赋值语句中,= 右边的值在赋予 = 左边的变量之前,首先要将右边的值的数据类型转换成左边变量的类型。也就是说,左边变量是什么数据类型,右边的值就要转换成什么数据类型的值。这个过程可能导致右边的值的类型升级(升级过程中位数的扩展位符号扩展或零扩展),也可能导致其类型降级(demotion)。所谓“降级”,是指等级较高的类型被转换成等级较低的类型。
    5.作为参数传递给函数时,char 和 short 会被转换成 int,float 会被转换成 double。使用函数原型可以避免这种自动升级。(如果一个函数的形参类型未知,例如使用了Old Style C风格的函数声明或者函数的参数列表中有 ... ,那么调用函数时要对相应的实参做Integer Promotion,此外,相应的实参如果是 float 型的也要被提升为 double 型,这条规则称为Default Argument Promotion。我们知道 printf 的参数列表中有 ... ,除了第一个形参之外,其它形参的类型都是未知的,因此我们在调用 printf("%c", ch) 时, char 型变量 ch 的值其实是被提升为 int 型之后才传给了 printf 。)

你可能感兴趣的:(数据类型)