[英]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.