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
。事实上,没有整数文本是负的。