gpt4 book ai didi

C++ 二元运算符警告

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:47 25 4
gpt4 key购买 nike

有人可以解释一些奇怪的警告行为吗。

我知道它正在隐式转换为整数。但是为什么前两行没问题?当使用 ~ 运算符时,编译器开始抛出警告。如果它正在转换为整数,它不应该也在前两行发出警告吗?

Ubuntu 16.04 g++5.4

#include <cstdint>
using namespace std;

// g++ -std=c++11 -Wall -Wconversion main.cpp -o main

// warning: conversion to ‘uint8_t {aka unsigned char}’ from ‘int’ may alter its value [-Wconversion]

int main()
{
uint8_t a = 0x00U;
uint8_t b = 0x01U;

a = a | b; // no warning
a |= b; // no warning
a = ~b; // warning
a = a | ~b; // warning
a |= ~b; // warning
return 0;
}

最佳答案

当一个小于int的变量或值参与算术表达式时,它是implicitly converted到一个int。对于某些类型,编译器可以执行另一个隐式转换回原始类型,但在其他类型中,如果不丢失数据,这是不可能的。

以您的无符号字节值 0x00 为例。当转换为 int 时,它变为 0x00000000。按位补码将其转换为 0xffffffff,在不丢失数据的情况下无法将其转换回无符号字节。

对于这样的值尤其不利,因为作为 int0xffffffff 等于 -1(阅读关于 two's complement 到了解原因),它不能真正干净地转换为无符号字节。

因此,为了避免溢出(除非需要),我建议您使用 int(或 unsigned int)进行所有整数运算。然后在绝对需要之前不要转换为更小的类型。

关于C++ 二元运算符警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51302646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com