十六进制文字的wsign -conversion警告
-Wsign-conversion Warning for Hex Literal
我最近遇到了以下问题。由于这个问题有点棘手,我把它作为对未来人们的问题/答案。
根据这些问题(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
,从而触发警告。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 消除"conversion to std::vector<int>::size_type to int"警告
- 使用华大基因时"Deprecated conversion from string constant to 'char*'"警告?
- 如何解决此棉绒警告"Implicit binary conversion from int to unsigned int"
- 十六进制文字的wsign -conversion警告