连接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))
           ;
}


以上是连接C风格的强制转换操作毫无意义吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>