C语言中类型转换问题
2016-09-10 13:47
211 查看
从一道题目引发的一些思考,记下以便以后遗忘。
这是题目
这道题看起来非常简单,但是往往很多人会给出一个错误答案:-3;而且回答的错误的思路我大体能想到两种:
1)直接加减,i=1-4=-3;这是最低级的错误,没有考虑运算过程中涉及的类型转换。
2)考虑到类型转换,想到char类型应该转换为int类型进行运算,思考的步骤大体如下:
unsigned char—>int
i=1:00000000 00000000 00000000 00000001(补码)
-4 :11111111 11111111 11111111 11111100(补码)
1+(-4): 11111111 11111111 11111111 11111101(补码)
最后算出来结果也是-3;
这是一种高级错误!!考虑到了类型转换,但是却忘了i的类型是unsigned char,类型转换只在运算的时候发生,最后还是回到变量本身的类型。
所以这道题的结果是unsigned char i=11111101;是253!
————————————————–分割线——————————————————————–
1.C语言中数据类型转换原则
(1)当有符号数与无符号数同类型进行运算时,会自动转化为无符号数进行运算;此时负数会用它的补码进行运算。
(2)当不同类型数据进行运算时,会自动转换为高类型,具体转换规则如下
(为防止精度损失,类型总是被提升为较高的类型)
(3)赋值:等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它;高类型向低类型赋值时,精度丢失,长度变短。
(4)函数调用:将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参。
(5)函数有返回值:系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,再赋值给调用函数返回。
2.强制转换
强制类型转换是通过类型转换运算来实现的。其一般形式为: (类型说明符) (表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如: (float) a 把a转换为实型(int)(x+y) 把x+y的结果转换为整型在使用。
强制转换时应注意以下问题:
1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加。
无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
3.有符号和无符号数之间的转换
原则:无符号转换,高位0扩展;有符号转换,高位符号扩展。
如图:
具体关于这部分内容可以参考微软官方网站
https://msdn.microsoft.com/zh-cn/library/e9s326kw.aspx;
这是题目
int main() { unsigned char i = 1; i -= 4; printf(“the value of i is: % d”, i); }
这道题看起来非常简单,但是往往很多人会给出一个错误答案:-3;而且回答的错误的思路我大体能想到两种:
1)直接加减,i=1-4=-3;这是最低级的错误,没有考虑运算过程中涉及的类型转换。
2)考虑到类型转换,想到char类型应该转换为int类型进行运算,思考的步骤大体如下:
unsigned char—>int
i=1:00000000 00000000 00000000 00000001(补码)
-4 :11111111 11111111 11111111 11111100(补码)
1+(-4): 11111111 11111111 11111111 11111101(补码)
最后算出来结果也是-3;
这是一种高级错误!!考虑到了类型转换,但是却忘了i的类型是unsigned char,类型转换只在运算的时候发生,最后还是回到变量本身的类型。
所以这道题的结果是unsigned char i=11111101;是253!
————————————————–分割线——————————————————————–
1.C语言中数据类型转换原则
(1)当有符号数与无符号数同类型进行运算时,会自动转化为无符号数进行运算;此时负数会用它的补码进行运算。
(2)当不同类型数据进行运算时,会自动转换为高类型,具体转换规则如下
(为防止精度损失,类型总是被提升为较高的类型)
(3)赋值:等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它;高类型向低类型赋值时,精度丢失,长度变短。
(4)函数调用:将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参。
(5)函数有返回值:系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,再赋值给调用函数返回。
2.强制转换
强制类型转换是通过类型转换运算来实现的。其一般形式为: (类型说明符) (表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如: (float) a 把a转换为实型(int)(x+y) 把x+y的结果转换为整型在使用。
强制转换时应注意以下问题:
1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加。
无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
3.有符号和无符号数之间的转换
原则:无符号转换,高位0扩展;有符号转换,高位符号扩展。
如图:
具体关于这部分内容可以参考微软官方网站
https://msdn.microsoft.com/zh-cn/library/e9s326kw.aspx;
相关文章推荐
- 关于C语言的类型转换问题
- 无符号数运算问题——C语言隐式类型转换
- 【C语言】表达式求值中的类型转换问题
- C语言中malloc函数返回值是否需要类型强制转换问题
- C语言中的数据类型转换问题
- C语言中数据类型间的转换问题和注意事项
- C语言——运算符操作时的类型转换问题
- 函数返回值C语言中malloc函数返回值是否需要类型强制转换问题
- 关于C语言运算的自动提权及类型转换的问题
- C语言中malloc函数返回值是否需要类型强制转换问题
- c语言,java类型转换时遇到的大小端问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- C语言中类型转换问题?
- C语言中malloc函数返回值是否需要类型强制转换问题
- C语言中类型转换时的数据丢失问题
- 关于int型整数按逆序存入数组中的问题(也即十进制数和其他类型数据的转换问题)
- DECODE和日期类型转换中出现的问题
- ASP.Net中用ViewState存储自定义复杂对象后类型转换的一个问题
- c语言中的类型转换与复合类型
- C++数据类型转换问题一览