为什么-2147483648不能用十六进制文字表示?

问题描述 投票:0回答:2

根据 C++ 文档,保存十六进制文字的大小从

int -> unsigned int -> long -> unsigned long -> long long -> unsigned long.

增长

但我想知道如何指定十六进制文字-2147483648?

这应该是可能的,因为该值可以适合

int

但是编译下面的代码会出现以下错误。

一元减运算符应用于无符号类型,结果仍然无符号

#include <iostream>
#include <climits>
int main()
{
    std::cout << -0x80000000 << std::endl;
    return 0;
}

我可以使用十六进制文字表示的最大负文字是 -0x7fffffff`。

c++ c++11 integer hex literals
2个回答
0
投票

假设您的系统使用 2 的补码来表示负整数值,则对应于

-2147483648
的正确十六进制文字是
0x80000000

你不应该像你那样否定它。

以下最小示例演示了它:

#include <iostream>

int main() {
    int a = 0x80000000;
    std::cout << a << "\n";
}

输出:

-2147483648

现场演示


0
投票

默认情况下,不带类型说明符(末尾有“L”或“U”)的数字文字是有符号整数,除非它太大而无法放入有符号整数中。如果它适合无符号整数,则该文字将被视为无符号。如果它不适合有符号或无符号整数,则会出现错误。

文字 0x00000000 到 0x7fffffff 适合有符号整数,因此它们是有符号的。上面的任何文字都不适合有符号整数,因此它被视为无符号。 0x80000000 比 0x7ffffffff 稍高,因此它代表一个 unsigned int。您的编译器告诉您对 unsigned int 取反是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.