c 语言数据类型的隐式转换 + 数据溢出
1. C语言的4种隐式类型转换
情形 | 转换情况 |
---|---|
算术运算 | 低类型转换为高类型 |
赋值表达式 | 赋值符号右边的类型转换为左边的类型 |
函数调用 | 实参转换为形参的类型 |
函数返回 | return 表达式的类型转换为返回值类型 |
图示解释:
- 在算术运算中,如果混合表达式中没有比int类型级别高的,
参与运算的数值先转换为 int 型后再进行运算; - 无符号和有符号的混合运算中,有符号类型会转换为无符号类型;
小贴士:
-
隐式类型转换是编译器自动进行转换的,
不会出现警告和错误;
2. 数据的溢出
溢出:计算产生的结果超过该类型所嫩表述的范围
类型 | 范围 | 举例 | 内存结果 | 分析 |
---|---|---|---|---|
有符号类型运算 | 结果没有超过类型 表示数字总数 | char ch = 198; | ch = -58 | 198 - 256 = -58; |
结果超过类型 表示数字总数 | char ch = 682; | ch = -86 | 682 - 256 = 426; 426 - 256 = 170; 170 - 256 = -86; | |
无符号类型运算 | 结果为负数 | unsigned char ch = -130; | ch = 126; | -130 + 256 = 126; |
结果为超过范围的正数 | unsigned char ch = 682; | ch = 170; | 682 - 256 = 426; 426 - 256 = 170; | |
有符号和无符号混合运算 | 结果为负数 | char ch = -128; unsigned char ch1 = 28; ch1 += ch; | ch1 = 156 | -128 + 256 = 128; 128 + 128 = 156; |
结果为正数 | char ch = -128; unsigned char ch1 = 255; ch1 += ch; | ch1 = 127; | 255 + (-128) = 127; |
总结:
- 超过该类型的正数结果——>该结果一直减该类型最大表示数字个数,直到在该类型范围内
- 超过该类型的负数结果——>该结果一直加该类型最大表示数字个数,知道在该类型范围内
- 不要使用无符号和有符号直接的隐式转换,很容易产生bug