- Hex Literal的-Wsign-conversion警告

时间:2014-08-02 02:44:34

标签: c++ c literals

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

根据这些问题(Unsigned hexadecimal constant in C?C interpretation of hexadecimal long integer literal "L"),文字适合可以表示它们的第一个数据类型。在这种情况下,列表应为:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

此行为来自C标准6.4.4.1。但是,如果您编写以下代码(我使用C ++)且启用了-Wsign-conversion

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。问题是什么?

1 个答案:

答案 0 :(得分:5)

问题是编译器不会将0xFF00FF00视为否定。它无法知道你的意思是最高位是符号位。

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