最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

66.类型转换

来源:博客园

类型所能表示的值的范围决定了转换的过程:

●当我们把个非布尔类型的算术值赋给布尔类型时,初始值为0则结果为false,否则结果为true。


(资料图)

●当我们把一个布尔值赋给非布尔类型时, 初始值为false则结果为0,初始值为true则结果为1。

●当我们把一个浮点数赋给整数类型时, 进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。

●当我们把一个整数值赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量, 精度可能有损失。

●当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char可以表示0至255区间内的值, 如果我们赋了 个区间以外的值,则实际的结果是该值对256取模后所得的余数。 因此, 把-1赋给8比特大小的unsigned char 所得的结果 是255。

●当我们赋给带符号类型一个超出它表示范围的值时, 结果是未定义的(undefined)。此时, 程序可能继续工作、 可能崩溃, 也可能生成垃圾数据。

建议:避免无法预知和依赖于实现环境的行为

含有无符号类型的表达式

尽管我们不会故意给无符号对象赋一个负值,却可能(特别容易)写出这么做的代码。例如,当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数。把耳让转换成无符号数的过程和把int直接赋给无符号变址一样:

unsigned u = 10; int i= -42; std::cout << i + i << std::endl; // 输出-84std::cout << u + i << std::endl;//如果int占32位,输出294967264

当从无符号数中减去 一个值时,不管这个值是不是无符号数,我们都必须确保结果不能是一个负值:

unsigned u1 = 42, u2 = 10; std::cout << u1 -u2 << std::endl;//正确:检出32std::cout << u2 -u1 << std::endl;//正确:不过,结果是取模后的值

无符号数不会小于0这一事实同样关系到循环的写法。

可能你会觉得反正也不打算输出负数,可以用无符号数来重写这个循环。然而,这个不经 意的改变却意味着死循环:

//错误:变量u永远也不会小于0"循环条件一直成立for (unsigned u = 10; u >= O; --u)std::cout << u << std::endl; //来看看当u等于0时发生了什么,这次迭代输出0,然后继续执行for语句里的表达式。

提示:切勿混用带符号类型和无符号类型

如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果这是因为带符号数会自动地转换成无符号数。例如,在一个形如a*b的式子中,如果a= -1,b = 1,而且a和b都是int,则表达式的值显然为-1。然而,如果a是int,而b是unsigned,则结果须视在当前机器上int所占位数而定。在我们的环境里,结果是4294967295。

关键词: