如果我想使用 <limits> 标头,则很容易编写最小整数:
std::int32_t small = std::numeric_limits<std::int32_t>::min();
Run Code Online (Sandbox Code Playgroud)
这small等于-2147483648。
我在一家图书馆工作,里面有这样的数字。因此最好写成
std::int32_t small = -2147483648;
Run Code Online (Sandbox Code Playgroud)
我在 Visual Studio 上遇到了问题,但是当我阅读 C++ 规范时,我发现它表明我无法对任何编译器执行此操作。我认为我不能这样做的原因是规范表明整数文字不包含负号。负号实际上后来变成了一元减号。因此,C++ 处理整数文字 2147483648。这个数字太大,无法放入 int 中(假设 int 是 32 位,这是我正在考虑的平台上的),因此它必须是一个 long int (64 位) 。
(顺便说一句,这是我在 Visual Studio 上出错的地方。它似乎将 2147483648 视为无符号长整型,而不是有符号长整型,但这个问题与规范行为有关)
据我所知,无法将 32 位数字 -2147483648 写为 32 位文字。您必须首先将其设为 64 位文字 2147483648UL,然后将其取反。这似乎是一个疏忽,但它似乎也可以在任何地方编译(除了 Visual Studio),那么我错过了什么?
简单的解决方案是按位反转正确类型的最大值。考虑到所有固定宽度类型都保证使用二进制补码表示,最大最大值的按位反转将始终产生最大的负值(求反与翻转所有位并加一相同;反转省略了加一位步骤,因此你最终会得到一个离零更远的负数),所以你可以可靠地做到:
std::int32_t small = ~INT32_C(2147483647);
Run Code Online (Sandbox Code Playgroud)
isINT32_C函数宏用于创建正确大小的整数常量(它通常会扩展为空,使其成为~2147483647,除非int在您的系统上与 的大小不同int32_t)。
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |