您的位置:首页 > 编程语言 > C语言/C++

C语言中类型转换问题

2016-09-10 13:47 211 查看
从一道题目引发的一些思考,记下以便以后遗忘。

这是题目

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: