搜索
bottom↓
回复: 17

C语言中强制类型转换总结

[复制链接]

出0入0汤圆

发表于 2010-11-18 09:10:44 | 显示全部楼层 |阅读模式
估计弄懂这个根本问题的人,并不多吧。。:

1.自动类型转换

● 字符型变量的值实质上是一个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语言也提供了以显式的形式强制转换类型的机制。
● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。

2.赋值中的类型转换

当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:
(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面言最初是为了替代汇编语言而设计的,所以类型变换比较随意。当然, 用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-11-18 10:00:32 | 显示全部楼层
这个转换和编译器没有关系吗?

int ←── char,short 低  
疑问: 两个char相加,结果是int?

出0入0汤圆

发表于 2010-11-18 11:38:44 | 显示全部楼层
mark

出0入25汤圆

发表于 2010-11-18 12:41:03 | 显示全部楼层
先mark!

出0入0汤圆

发表于 2010-11-18 12:57:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-18 13:13:52 | 显示全部楼层
MARK!!

出0入0汤圆

发表于 2010-11-18 13:41:55 | 显示全部楼层
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4279781&bbs_page_no=1&search_mode=4&search_text=SeaDart&bbs_id=9999

出0入0汤圆

发表于 2010-11-18 15:25:54 | 显示全部楼层
看看。

出0入0汤圆

 楼主| 发表于 2010-11-18 15:27:44 | 显示全部楼层
LS的帖子写得也很好,立即数也分类型的

出20入70汤圆

发表于 2010-11-18 16:02:06 | 显示全部楼层
mark

出0入93汤圆

发表于 2010-11-18 16:17:16 | 显示全部楼层
钻点牛角尖:

2.赋值中的类型转换

当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:
(1) 浮点型与整型  
● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。
将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。

有错误吧。
这里针对的是赋值运算,那么
1、浮点数赋值给整数。这个不可能通过编译的,必须显式的强制转换。
2、将整型值赋给浮点型变量,数值不变。
会变的。以32位int类型转换成单精度为例,int类型共有2^32个数,表示的范围我就不写了;对应的float类型在这个范围里的数字远远小于2^32,何况float还有不规范的,因此必定会有改变的。比如,整型的123456789,转换成单精度浮点数,看看等于多少。123456789使用单精度浮点数根本表示不出来。

出0入0汤圆

发表于 2010-11-18 16:52:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-18 17:04:25 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2010-11-19 09:25:14 | 显示全部楼层
再总结个,原来b = 10ul * 10000;
和b = (unsigned long)10 * 10000; 都是强制转换啊。。

出0入0汤圆

发表于 2013-2-27 15:31:18 | 显示全部楼层
takashiki 发表于 2010-11-18 16:17
钻点牛角尖:

2.赋值中的类型转换

浮点数赋值给整数可以通过编译 刚刚我用WINTC做的实验可以

出0入0汤圆

发表于 2013-2-27 21:27:56 | 显示全部楼层
mark  谢谢分享

出0入0汤圆

发表于 2013-2-27 22:08:41 | 显示全部楼层
takashiki 发表于 2010-11-18 16:17
钻点牛角尖:

2.赋值中的类型转换

浮点数本身只能有6,7位有效数字,位数多了必然造成精度的损失,这个是没办法的.
123456789=+1.234567n e +8
那个n可能是8,也可能是别的

出0入0汤圆

发表于 2013-3-27 09:37:45 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 15:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表