首先引出一个问题,这是我在编写模拟器程序的时候遇到的,我们有如下的类型转换: int16_t v16s; uint16_t v16u; int32_t v32s; uint32_t v32u; v16s = 0xf08b; v16u = (uint16_t)v16s; //请问此时v16s和v16u在二进制表示形式上有什么不同吗? No.1 v32s = (int32_t)v16s; v32u = (uint32_t)v16s; //请问此时v32s和v32u在二进制表示形式上相同吗? No.2 v16s = 0x0f8b; v32s=(int32_t)v16s; v32u=(uint32_t)v16s; //请问此时v32s和v32u的值又是多少? No.3 v32s = 0xffff0fb8; v16s=(int16_t)v32s; v16u=(uint16_t)v32s;//请问此时v16s和v16u的值是多少? No.4 v16s = 0xf08b; v16u=0xf08b; v32s=(int32_t)v16s; v32u=(uint32_t)v16u; //请问此时v32s和v32u的值是多少? No.5 首先告诉大家答案:
对于自动类型转换,最常见的就是混合运算以及赋值运算,还有一种就是函数值的类型转换
可以利用强制类型转换运算符将一个表达式转换成所需类型: 例如: (double)a (将a转换成double类型) (int)(x+y) (将x+y的值转换成整型) (float)(5%3) (将5%3的值转换成float型) (int)(1.5+2.3) = ? (int)1.5+2.3=? 注意,表达式应该用括号括起来。如果写成(int)x+y 则只将x转换成整型,然后与y相加。 讲到这里,您或许就明白了,哦,原来我们是使用了强制类型转换的语法,但是程序实质上却是自动类型转换! 所以在执行了语句:v16s = 0xf08b; v32s=(int32_t)v16s; v32u=(uint32_t)v16s; 后v32s和v32u的二进制表示形式才是一样的! 对于从高到低的强制转换,实质上就是一个截断的操作,只把低端需要的部分保留,其余的部分直接扔掉了。所以对于语句: v32s = 0xffff0fb8; v16s=(int16_t)v32s; v16u=(uint16_t)v32s; 执行之后v16s和v16u的二进制表示形式才是一样的! 注:我一直强调的都是它们的二进制表示形式是否相同,而没有说它们的值是否相同,因为同样的二进制表示形式,你把它当作有符号数和无符号数的值在决大部分的情况下都是不同的(除了最高位为0的相同外,其他都不同) 混合运算 混合运算是指在一个表达式中参与运算的对象不是相同的数据类型,例如: int a, j, y; float b; long d; double c; 则对赋值语句: y=j+'a'+a*b-c/d; 其运算次序和隐含的类型转换如下: ① 计算a*b,由于变量b为float型,所以运算时先由系统自动转换为double型,变量a为int型,两个运算对象要保持类型一致,变量a也要转换为double,运算结果为double型。 ② 由于c为double型,将 d 转换成 double 型,再计算 c/d,结果为double型。 ③ 计算j+'a',先将'a'(char型)转换成整型数再与j相加,结果为整型。 ④ 将第1步和第3步的结果相加,先将第3步的结果(int)转换成double型再进行运算,结果为double型。 ⑤ 用第4步的结果减第2步的结果,结果为double型。 ⑥ 给y赋值,先将第5步的结果double型转换为整型(因为赋值运算左边变量y为整型),即将double型数据的小数部分截掉,压缩成int型,然后进行赋值。 以上步骤中的类型转换都是C语言编译系统自动完成的。 |
|
来自: angelbrian > 《囧~VC》