十六进制文字的wsign -conversion警告

-Wsign-conversion Warning for Hex Literal

本文关键字:-conversion 警告 wsign 文字 十六进制      更新时间:2023-10-16

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

根据这些问题(C中的无符号十六进制常数?在C语言中,十六进制长整数字面值的解释"L")字面值适合于可以表示它们的第一个数据类型。在本例中,列表应该是:

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;
                 ^

我发现这很奇怪,因为0xFF00FF00是整数-16,711,936的二进制表示,它很容易适合int。有什么问题吗?

问题是0xFF00FF00不被编译器视为负面的。它无法知道你的意思是最高位是符号位。

相反,字面值被视为4,278,255,360,它不适合整数的最大值2,147,483,647。因此,编译器在列表中向下移动一步,选择unsigned int,从而触发警告。