类型所能表示的值的范围决定了转换的过程:
- 当把一个非bool类型的算术值赋值给bool类型时,0转换为false,否则转换为true。
- 当把一个bool值赋给非bool类型时,false转换薇0,true转换为1。
- 当把一个浮点数赋给整数类型时,仅保留整数部分。
- 当把一个整数值赋给浮点类型时,小数部分记为0。如果该整数所占空间超过了浮点类型的容量,精度可能有损失。
- 当给无符号类型赋一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。比如,8比特大小的unsigned char可以表示0至255区间内的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char所得的结果是255。
- 当给带符号类型赋一个超出它表示范围的值时,结果是未定义的。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。
- 当一个表达式中既有无符号数又有int值时,int值会自动转换成无符号数:
unsigned u=10; int i=-42; std::cout<<i+i<<std::endl; //输出-84 std::cout<<i+u<<std::endl; //如果int占32位,输出4294967264
- 当从无符号数中减去一个值时,不管这个值是不是无符号数,必须确保结果不能时一个负值:
unsigned u1=42,u2=10; std::cout<<u1-u2<<std::endl; //正确,输出32 std::cout<<u2-u1<<std::endl; //正确,但是结果是取模后的值