c – Hex文字的-Wsign-conversion警告
作者:互联网
我最近遇到了以下问题.因为它有点棘手,所以我把它作为未来人们的问答对.
根据这些问题(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.但是,如果您在启用-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,从而触发警告.
标签:c-3,c,literals 来源: https://codeday.me/bug/20190830/1769319.html