【C语言】表达式求值中的类型转换问题
2018-03-13 18:17
281 查看
表达式求值中的类型转换问题
隐式类型转换 表达式求值是程序中常见的一类问题,通常来讲只要知道各种运算符及其运算规则,表达式求值都是比较简单的。但是,有时候结果并非我们所期待的。首先来看一段程序:int main(){
char c1 = 12;
char c2 = 118;
char c3 = c1 + c2;
printf("c3=%d\n",c3);
return 0;
}对于初学者来讲,130是上述程序的正确输出。然而,正确结果为:-126.
这里就遇到了类型转换中的“整型提升”:C语言中的整型算术运算总是以至少缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型。整型提升是一种隐式类型转换。对上述程序进行分析,如下图:
再举个例子:a=(~a^b<<1)>>1;该表达式中要对b的bit位进行左移一位,此时如果我们把b提升成整型,即使左移了一位(“丢掉了”左边最高位),该位也并未丢失,仍存在其二进制位中。
算术转换 如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。因此,整型、实型、字符型数据间可以进行混合运算。
寻常算术体系:
如果某个操作数的类型在上面这个列表中排名较低,那么首先要隐式地转换为另外一个操作数的类型后再执行运算。
注意:要进行合理的算术转换,否则会存在潜在问题。如:
float f = 3.14; int num = f;此处进行了隐式类型转换,会存在精度丢失。
相关文章推荐
- 关于C语言运算的自动提权及类型转换的问题
- 无符号数运算问题——C语言隐式类型转换
- C语言中malloc函数返回值是否需要类型强制转换问题
- C语言中malloc函数返回值是否需要类型强制转换问题
- 基于C语言的表达式求值问题
- C语言表达式中的类型隐式转换
- 第五章 表达式(part3) 复合表达式的求值、new 和 delete 表达式、类型转换
- C语言中类型转换问题
- C语言中数据类型间的转换问题和注意事项
- 表达式计算过程中的类型转换,经常被忽略的问题
- C语言中malloc函数返回值是否需要类型强制转换问题
- C语言中类型转换问题?
- 关于C语言的类型转换问题
- 表达式类型转换问题
- c语言,java类型转换时遇到的大小端问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- C语言中类型转换时的数据丢失问题
- C语言表达式中的类型隐式转换
- 使用栈解决表达式求值(C语言)及问题总结
- c语言算术运算表达式与赋值运算表达式的类型转换规则