C++ -十六进制文字的Wsign转换警告

C++ -十六进制文字的Wsign转换警告,c++,c,literals,C++,C,Literals,我最近遇到了以下问题。因为这有点棘手,我把它作为未来人们的问答对 根据这些问题,(,)文本适合于表示它们的第一个数据类型。在这种情况下,列表应为: int unsigned int long int unsigned long int long long int unsigned long long int 此行为来自C标准6.4.4.1。但是,如果在启用了-Wsign conversion的情况下编写以下代码(我使用的是C++): int32_t mask = 0xFF00FF00; 。然

我最近遇到了以下问题。因为这有点棘手,我把它作为未来人们的问答对

根据这些问题,(,)文本适合于表示它们的第一个数据类型。在这种情况下,列表应为:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
此行为来自C标准6.4.4.1。但是,如果在启用了
-Wsign conversion
的情况下编写以下代码(我使用的是C++):

int32_t mask = 0xFF00FF00;
。然后得出:

<file>:<line>:17: warning: conversion of unsigned constant value to negative integer [-Wsign-conversion]
  int32_t mask = 0xFF00FF00;
                 ^
::17:警告:将无符号常量值转换为负整数[-Wsign conversion]
int32_t mask=0xFF00FF00;
^

我觉得这很奇怪,因为
0xFF00FF00
是整数
-16711936
的二进制表示形式,很容易用整数表示。有什么问题吗?

问题是
0xFF00FF00
没有被编译器视为负数。它无法知道最高的位是符号位


相反,文本被视为正数
4278255360
,它不适合整数的最大值
2147483647
。因此,编译器将列表向下移动一步,选择
无符号整数
,从而触发警告。

掩码
几乎肯定应该声明为
uint32\t
。事实上,没有整数文本是负的。