两种类型转换有何不同?
How are the two typecasts different?
我正在Coursera上做一个MOOC,但这段代码不起作用:
unsigned int W, H, D;
uint64_t total_weight = 0;
for (unsigned int i = 0; i < N; ++i) {
cin >> W >> H >> D;
total_weight += static_cast<uint64_t>(W * H * D);
}
total_weight *= R;
cout << total_weight;
但是,这个确实:
unsigned int W, H, D;
uint64_t total_weight = 0;
for (unsigned int i = 0; i < N; ++i) {
cin >> W >> H >> D;
total_weight += static_cast<uint64_t>(W) * H * D;
}
total_weight *= R;
cout << total_weight;
如您所见,区别在于这一行:
total_weight += static_cast<uint64_t>(W) * H * D;
这个演员阵容与
total_weight += static_cast<uint64_t>(W * H * D);
?
total_weight += static_cast<uint64_t>(W * H * D);
在这里,W * H * D
计算为unsigned int
s 的乘法,然后转换为uint64_t
这不会在计算W * H * D
时使您免于潜在的溢出。
total_weight += static_cast<uint64_t>(W) * H * D;
这里static_cast<uint64_t>(W) * H * D
计算为uint64_t
s的乘法,因为W
被转换为uint64_t
和H
,D
提升为uint64_t
。因此,在这种情况下,在乘法过程中遭受溢出的机会较小。
相关转换规则说明如下:
8 表达式 [表达式]
11 许多期望算术操作数或运算数的二元运算符 枚举类型导致转换和产生结果类型类似 道路。目的是产生一个通用类型,这也是 结果。这种模式称为通常的算术转换, 定义如下:
。
11.5.2 否则,如果两个操作数都有有符号整数类型或都有无符号整数类型,则类型较小的操作数 整数转换秩应转换为操作数的类型 具有更高的等级。
和:
7.15 整数转换排名 [转换排名]
1 每个整数类型都有一个整数转换排名,定义为 遵循:
。
1.3 长长国际的等级应大于长整的等级,长国际的等级应大于国际的等级,国际的等级应为 大于短 int 的秩,该等级应大于 已签名字符的等级。
1.4 任何无符号整数类型的秩应等于相应有符号整数类型的秩。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 类模板实例化中的类型转换