uintmax_t 不处理 128 位
uintmax_t not handling 128 bits
我想在我的代码中定义千兆字节,所以我首先使用了 unsigned long
。但是,unsigned long
无法处理 2 * gigabyte
。
所以,我用 long long
替换了它,但我得到了相同的编译 error/warning:
错误:表达式 [-Werror=overflow]
中的整数溢出
最后,我查找了大整数,发现 uintmax_t 是我需要的,因为它是 128 位。
不幸的是,我仍然遇到同样的错误。我猜是有点小问题,但我能找到它。
请在下面找到相关代码:
#define kilobyte 1024
#define megabyte 1024 * kilobyte
#define gigabyte 1024 * megabyte
uintmax_t threshold = 2 * gigabyte;
最后,在运行'make'
之后
g++ -Wall -Wextra -Werror -pedantic -pthread -std=c++0x -g -o lcr main.cpp
我得到了:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:104:17: error: integer overflow in expression [-Werror=overflow]
cc1plus: all warnings being treated as errors
我们来看一段代码:
uintmax_t x = 2 * 1024;
这里发生了什么,我们有 (int) 2 * (int) 1024
,然后我们将结果提升为 uintmax_t
。
相反,我们想要:(uintmax_t) 2 * (uintmax_t) 1024
。我们可以通过这种方法轻松地将整数提升为 long long
:
#define kilobyte 1024ULL
#define megabyte 1024ULL * kilobyte
#define gigabyte 1024ULL * megabyte
uintmax_t threshold = 2ULL * gigabyte;
两个 int
的乘积显然仍然是 int
类型 - 我们在您的宏中处理的文字是 int
.[=25= 类型]
10243 = 230 几乎可以用 32 位 int
表示。但是,2*230 = 231 对于 32 位有符号的来说正好太大了int
坚持。
这可以通过将常量定义为适当类型的对象来解决:
const std::uintmax_t kilobyte = 1024;
const std::uintmax_t megabyte = 1024 * kilobyte;
const std::uintmax_t gigabyte = 1024 * megabyte;
const std::uintmax_t threshold = 2 * gigabyte;
由于对 *
的操作数执行了通常的算术转换,因此不会发生溢出。
我想在我的代码中定义千兆字节,所以我首先使用了 unsigned long
。但是,unsigned long
无法处理 2 * gigabyte
。
所以,我用 long long
替换了它,但我得到了相同的编译 error/warning:
错误:表达式 [-Werror=overflow]
最后,我查找了大整数,发现 uintmax_t 是我需要的,因为它是 128 位。
不幸的是,我仍然遇到同样的错误。我猜是有点小问题,但我能找到它。
请在下面找到相关代码:
#define kilobyte 1024
#define megabyte 1024 * kilobyte
#define gigabyte 1024 * megabyte
uintmax_t threshold = 2 * gigabyte;
最后,在运行'make'
之后g++ -Wall -Wextra -Werror -pedantic -pthread -std=c++0x -g -o lcr main.cpp
我得到了:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:104:17: error: integer overflow in expression [-Werror=overflow]
cc1plus: all warnings being treated as errors
我们来看一段代码:
uintmax_t x = 2 * 1024;
这里发生了什么,我们有 (int) 2 * (int) 1024
,然后我们将结果提升为 uintmax_t
。
相反,我们想要:(uintmax_t) 2 * (uintmax_t) 1024
。我们可以通过这种方法轻松地将整数提升为 long long
:
#define kilobyte 1024ULL
#define megabyte 1024ULL * kilobyte
#define gigabyte 1024ULL * megabyte
uintmax_t threshold = 2ULL * gigabyte;
两个 int
的乘积显然仍然是 int
类型 - 我们在您的宏中处理的文字是 int
.[=25= 类型]
10243 = 230 几乎可以用 32 位 int
表示。但是,2*230 = 231 对于 32 位有符号的来说正好太大了int
坚持。
这可以通过将常量定义为适当类型的对象来解决:
const std::uintmax_t kilobyte = 1024;
const std::uintmax_t megabyte = 1024 * kilobyte;
const std::uintmax_t gigabyte = 1024 * megabyte;
const std::uintmax_t threshold = 2 * gigabyte;
由于对 *
的操作数执行了通常的算术转换,因此不会发生溢出。