c语言中的类型强制转换

强制类型转换是经过类型转换运算来实现的。其通常形式为: (类型说明符) (表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如: (float) a 把a转换为实型(int)(x+y) 把x+y的结果转换为整型在使用强制转换时应注意如下问题:
1.类型说明符和表达式都必须加括号(单个变量能够不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型以后再与y相加了。
2.不管是强制转换或是自动转换,都只是为了本次运算的须要而对变量的数据长度进行的临时性转换,而不改变数听说明时对该变量定义的类型。spa

例1:
main()
{
float f=5.75;
printf("(int)f=%d,f=%f/n",(int)f,f);
}
f<--5.75
将float f强制转换成int f float f=5.75;printf("(int)f=%d,f=%f/n",(int)f,f); 本例代表,f虽强制转为int型,但只在运算中起做用, 是临时的,而f自己的类型并不改变。所以,(int)f的值为 5(删去了小数)而f的值仍为5.75。设计

例2:对象

好比咱们能够(int)'A',这样转换后的结果为A的ASCII码数值,由于那块内存原本就存的那个数,只是换个形式使用而已。 知道上面的原则,咱们能够对任何数据类型进行转换,可是转换的结果可能不是你想像的结果,举例(int)'9'的结果为多少?不是9而是0x39。来个高 深点的printf("%d",'12');的输出是什么?正确答案是12849,由于printf("%d",'12'),打印的是存储12的内存地址 上的内容,即ASCII码值,12的低位数存储在低位地址,即1存储在低位,高位存储在高位地址,0x32就是2的ASCII码,0x31就是1的 ASCII码,因此是0x3231,转换成10进制就是12849!内存

 

 

 

● 字符型变量的值实质上是一个8位的整数值,所以取值范围通常是-128~127,char型变量也能够加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当作unsighed char型对待, 取值范围老是0~255)。
● 若是一个运算符两边的运算数类型不一样,先要将其转换为相同的类型,即较低类型转换为较高类型,而后再参加运算,转换规则以下图所示。
double ←── float 高

long

unsigned

int ←── char,short 低
● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不一样类型时的转换,如一个long 型数据与一个int型数据一块儿运算,须要先将int型数据转换为long型, 而后二者再进行运算,结果为long型。全部这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型便可。这些转换能够说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。
● 当较低类型的数据转换为较高类型时,通常只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。
编译

赋值中的类型转换变量

当赋值运算符两边的运算对象类型不一样时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换以下:
(1) 浮点型与整型
● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。
将整型值赋给浮点型变量,数值不变,只将形式改成浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换其实是强制的。
(2) 单、双精度浮点型
● 因为C语言中的浮点值老是用双精度表示的,因此float 型数据只是在尾部加0延长为doub1e型数据参加运算,而后直接赋值。doub1e型数据转换为float型时,经过截尾数来实现,截断前要进行四舍五入操做。
(3) char型与int型
● int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。
● chr型数值赋给int型变量时, 一些编译程序无论其值大小都做正数处理,而另外一些编译程序在转换时,若char型数据值大于127,就做为负数处理。对于使用者来说,若是原来char型 数据取正值,转换后仍为正值;若是原来char型值可正可负,则转换后也仍然保持原值, 只是数据的内部表示形式有所不一样。
(4) int型与1ong型
● long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。(这里假定int型占两个字节)。
将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。
(5) 无符号整数
● 将一个unsigned型数据赋给一个占据一样长度存储单元的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照赋,内部的存储方式不变,但外部值却可能改变。
● 将一个非unsigned整型数据赋给长度相同的unsigned型变量时, 内部存储形式不变,但外部表示时老是无符号的。
/*例:赋值运算符举例 */
main()
{ unsigned a,b;
int i,j;
a=65535;
i=-1;
j=a;
b=i;
printf("(unsigned)%u→(int)%d/n",a,j);
printf("(int)%d→(unsigned)%u/n",i,b);
}
运行结果为:
(unsigned)65535→(int)-1
(int)-1→(unsigned)65535

● 计算机中数据用补码表示,int型量最高位是符号位,为1时表示负值,为0时表示正值。若是一个无符号数的值小于32768则最高位为0,赋给 int型变量后、获得正值。若是无符号数大于等于32768,则最高位为1, 赋给整型变量后就获得一个负整数值。反之,当一个负整数赋给unsigned 型变量时,获得的无符号值是一个大于32768的值。
● C语言这种赋值时的类型转换形式可能会令人感到不精密和不严格,由于无论表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。
● 而转变后数据可能有所不一样,在不加注意时就可能带来错误。 这确实是个缺点,也遭到许多人们批评。但不该忘记的是:c面言最初是为了替代汇编语言而设计的,因此类型变换比较随意。固然, 用强制类型转换是一个好习惯,这样,至少从程序上能够看出想干什么。
数据类型

相关文章
相关标签/搜索