连接C风格的强制转换操作毫无意义吗?
在工作中,我在我的代码库中找到了这段代码,其中字符被转换了两次:
constexpr unsigned int foo(char ch0, char ch1, char ch2, char ch3)
{
return ((unsigned int)(unsigned char)(ch0)
| ((unsigned int)(unsigned char)(ch1) << 8)
| ((unsigned int)(unsigned char)(ch2) << 16)
| ((unsigned int)(unsigned char)(ch3) << 24))
;
}
一个演员阵容还unsigned int不够吗?
在这种情况下,最好将其设为static_cast<unsigned_int>?
回答
是,有一点不同。考虑char's 中的一个是否具有 的值-1。当你做
(unsigned int)(unsigned char)-1
自从您第一次进行转换 modulo 以来,您得到255了 8 位。如果您改为使用char2^8
(unsigned int)-1
那么你会得到4294967295一个 32 位,int因为你现在正在做转换 modulo 2^32。
所以第一次转换保证结果可以用 8 位表示,或者不管字符的实际大小是什么,然后第二次转换是将它提升为更宽的类型。
unsigned char如果您将函数参数更改为类似,则可以摆脱强制转换
constexpr unsigned int foo(unsigned char ch0, unsigned char ch1,
unsigned char ch2, unsigned char ch3)
{
return static_cast<unsigned int>(ch0)
| static_cast<unsigned int>(ch1) << 8)
| static_cast<unsigned int>(ch2) << 16)
| static_cast<unsigned int>(ch3) << 24))
;
}