【发布时间】:2019-05-06 07:39:47
【问题描述】:
在我工作的公司中,很多代码经常使用 unsigned char 类型来处理小数字,以避免在数据结构中出现不必要的填充。我很少看到这个问题,但是我在使用位运算符设置错误标志时遇到了一个隐式转换的小问题。我通过简单地明确找到了一种解决方法,但我想知道是否有更优雅的方法。顺便说一句,我们用 c++11 编译
鉴于下面的错误代码枚举:
enum ErrorType : unsigned char
{
OK. = 0x00,
ERROR01 = 0x01,
ERROR02 = 0x02
};
并假设我有一些带有 errorType 类型的私有成员的类 这将使用公共成员来设置或取消设置标志,例如:
struct S
{
public:
void setError1();
void unsetError1();
private:
ErrorType errorType;
};
如果我尝试在下面隐式设置值:
void S::setError1()
{
this->errorType |= ERROR01;
}
我收到类型转换错误
但是,如果我明确地转换按位转换,它就可以工作
this->errorType = ErrorType(this->errorType | ERROR01);
问题似乎在于按位转换的输出始终是整数,不一定反映输入类型。这是真的?如果是这样,有没有办法为它指定一个类型,这样我就不必每次都显式地强制转换?
【问题讨论】:
-
enum ErrorType : unsigned char- 你可能想要enum class那里.. -
创建自己的
ErrorType& operator|=(ErrorType& a, ErrorType b); -
@JesperJuhl 不一定,虽然
-
注意:标准中没有对
char或short的操作。所有操作员至少在int上工作。因此char在操作前被转换为int。运算结果与输入参数相同(转换后)。请参阅:Implicit type conversion rules in C++ operators 注意最后一条规则:Both operands are promoted to int -
@duskwuff 是全球运营商,不是会员
标签: c++ c++11 casting bit-manipulation