繁体   English   中英

连接 C 风格的强制转换操作是否毫无意义?

[英]Is it pointless to concatenate C-style cast operations?

在工作中,我在我的代码库中发现了这段代码,其中字符被转换了两次:

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是否具有-1的值。 当你这样做

(unsigned int)(unsigned char)-1

自从您第一次进行模2^8转换以来,您得到255的 8 位char 如果您改为使用

(unsigned int)-1

那么您将获得4294967295的 32 位int ,因为您现在正在进行模2^32的转换。


所以第一次转换保证结果可以用 8 位表示,或者无论 char 的实际大小是多少,然后第二次转换是将其提升为更广泛的类型。


如果您将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))
           ;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM