前几天,我遇到了这个结构:
static_cast<size_type>(-1)
Run Code Online (Sandbox Code Playgroud)
在一些示例C++代码中,可能(取决于where的详细信息size_type)等同于以下C:
(size_t)(-1)
Run Code Online (Sandbox Code Playgroud)
据我所知,它的工作原理是二进制补码算术中-1的表示形式,11111...1就像你所拥有的那样多,所以这是获得无符号类型size_t可以容纳的最大值的快速方法.但是,我的理解是C不保证将使用二进制补码; 如果C实现使用一个补码,这将比最大值小1,如果它使用有符号幅度,它将只是最大值的一半.
是否有一些我不知道的皱纹确保无论使用的有符号整数的表示如何都能正常工作?C和C++之间有什么不同(许多令人惊讶的事情都有)?
Jer*_*fin 20
对无符号算术的要求保证将-1转换为无符号类型将产生目标类型可能的最大数量.C99,§6.2.5/ 9:"......无法用结果无符号整数类型表示的结果以一个大于可由结果类型表示的最大值的数量的模数减少."
这在C和C++中是相同的(在C++标准中,类似的措辞在脚注41中找到 - 它不是规范性的,但它正在解释其他措辞).
Ale*_*tov 14
要做到"安全"并以"正确"(C++)的方式行事,值得一看STL:
std::numeric_limits<size_t>::max()
Run Code Online (Sandbox Code Playgroud)
"据我了解,它的工作原理是二进制补码算术中-1的表示是......".
不,它根本不是基于这个事实.它基于标准要求,转换为N位无符号类型的singed值必须产生无符号值,该值与原始带符号的一个模2 ^ N"相等".
无论实现使用何种签名表示,它都必须以这种方式工作.在2的补码的情况下,它本身就是这样工作的,但是对于其他表示,编译器将不得不做额外的工作以满足标准要求.
| 归档时间: |
|
| 查看次数: |
1081 次 |
| 最近记录: |