算数转换
- 当执行算术运算时,如果操作对象的类型不同,就会产生数据类型转换。
-
转换规则:
- 朝着精度更高、长度更长的方向转换
- 保无符号规定:当运算符两边别离是 signed 有符号类型和 unsigned 无符号类型时,产生算术转换,将 signed 有符号类型转换为无符号类型。
- 例如:下列输出后果为 大于
#include <stdio.h>
int i ; // 全局变量未初始化,默认为 0
int main()
{
i--; // i 为有符号类型,i = -1
if (i > sizeof(i))
{printf("大于");
}
else
{printf("小于");
}
}
-
在 if 语句判断时,产生了数据类型的转换
- i 为 -1
- 二进制为 1000 0000 0000 0000 0000 0000 0000 0001
- 补码为:1111 1111 1111 1111 1111 1111 1111 1111
- 算数转换,当初零碎认定 i 为 unsigned int 型,无符号类型均为负数,源反补码雷同
- 所以当初 i 的源码也为 1111 1111 1111 1111 1111 1111 1111 1111
- 所以在 if 语句判断这里,i 是大于 4 的(sizeof(i) = 4)
- 留神:i 的理论值并没有产生扭转,只是在运算时,解析办法变了。