【发布时间】:2016-10-06 15:55:15
【问题描述】:
我正在尝试获取某个无符号整数类型的最大值,但不包括<limits> 之类的任何标头。所以我想我会简单地翻转无符号整数值 0 的位。
#include <iostream>
#include <limits>
int main()
{
std::cout << (~0U) << '\n'; // #1
std::cout << (std::numeric_limits< unsigned >::max()) << '\n'; // #2
return 0;
}
我对这些之间的细微差别不是很有经验。这就是为什么我要询问使用第一种方法是否会出现一些意外行为或一些平台/架构问题。
【问题讨论】:
-
~0U很好。 -
标准不保证二进制补码整数表示,所以这个技巧严格来说是不可移植的。实际上,它可能总是有效,但您应该更愿意将
0转换为预期类型,而不是指定为0U,即unsigned int。例如,当int使用的位数少于long long时,unsigned long long b = ~0U;会为您提供不正确的最大unsigned long long值。 -
建议
std::cout << ((unsigned type of your choosing) -1) << '\n';或static_cast -
对这个问题的回答引用了似乎支持 chux 铸造
-1: stackoverflow.com/questions/21769068/… 的想法的新标准 -
@ChristopherOicles 这个问题没有负数,所以是否使用负数的 2 的补码表示并不重要
标签: c++ c bit-manipulation numeric-limits