在 AND 和比较时进行符号转换
Sign conversion when ANDing and comparing
我有以下代码:
const uint8_t HEADER_SIZE = 0x08;
std::vector<uint8_t> a, b;
uint8_t x;
/* populate 'a', 'b'. Set 'x' */
for ( uint8_t i = 0; i < HEADER_SIZE; ++i )
{
// The if statement (specifically the AND): Conversion to 'unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
if ( x != ( a[i + HEADER_SIZE] & b[i] ) )
{
/* ... */
break;
}
}
我尝试投射几乎所有内容,但我似乎无法弄清楚为什么一个简单的 AND 会导致此警告。这两个变量都是无符号的。有什么想法吗?
a[i + HEADER_SIZE]
和 b[i]
都将提升为 int
,因为尽管它们都是无符号类型,但它们比 int
更窄的类型。所有较窄的整数类型都将提升为 int
(如果int
可以表示要升级的类型的所有值)或unsigned int
用于所有内置算术运算。
将所有操作数显式转换为unsigned int
应该使警告静音:
unsigned int a_dash = a[i + HEADER_+SIZE];
unsigned int b_dash = b[i];
unsigned int x_dash = x;
if (x_dash != (a_dash & b_dash))
{ // ...
你的uint8_t
在被&
一起之前被提升为int
。然后int
被比作x
,这仍然是uint8_t
。同样的事情发生在i + HEADER_SIZE
.将结果转换回uint8_t
应该会消除警告。
x != uint8_t(a[uint8_t(i + HEADER_SIZE)] & b[i])
问题出在索引上,请尝试:
_a = a[i + HEADER_SIZE];
_b = b[i];
if ( x != (_a & _b) )
您将看到问题出在_a = ...线。这是因为添加 i 和 HEADER_SIZE 会导致从 uint8_t 升级到 int。
相关文章:
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 将浮点数转换为无符号字符数组并打印出来
- 将无符号转换为复杂<int>原因符号转换警告
- 自动符号转换,用于对类等数学向量进行操作
- 矢量浮点到整数/符号转换
- C++编译器或预处理器是否可以将符号转换为大写
- 在 AND 和比较时进行符号转换
- 多字节到宽字符将 (°) 度数符号转换为
- Java中的反向无符号到有符号转换
- 我能把字符符号转换成字符串吗