我最近遇到了以下问题。由于它有点棘手,我把它作为未来人们的问答对。
根据这些问题(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。问题是什么?
答案 0 :(得分:5)
问题是编译器不会将0xFF00FF00
视为否定。它无法知道你的意思是最高位是符号位。
相反,文字被视为正编号4,278,255,360
,它不符合整数的2,147,483,647
的最大值。因此,编译器向下移动一步,选择unsigned int
,从而触发警告。