代码之家  ›  专栏  ›  技术社区  ›  Tim Randall

当从int中剥离位时,编译器会警告一个转换而不是其他转换。有解决办法吗?

c++
  •  1
  • Tim Randall  · 技术社区  · 6 年前

    unsigned ARGB;
    unsigned char a( ARGB >> 24 );
    unsigned char r( ( ARGB & 0xFF0000 ) >> 16 ); // warning!
    unsigned char g( ( ARGB & 0xFF00 ) >> 8 );
    unsigned char b( ARGB & 0xFF );
    

    编译器报告“警告C4244:'初始化':从'int'转换为'char',可能丢失数据”。。。但只有第二次转换。

    我想我知道它为什么这么做了。 a b g ,按位 & 结果是16个有效位(可以存储在 short 结果右移只留下8位。但是按位 & 操作完成时间 r 相比之下,将中间值保留为24个有效位,这将需要 int

    由于我们将(几乎所有)警告都视为错误,所以这是我需要解决的问题。显然我可以用 static_cast 明确地记录我想要的东西,但这(在我看来)是一个丑陋的工具,也是代码可以写得更好的标志。

    有人知道一种好的、整洁的、符合标准的、可移植的代码形式,可以执行所需的数据转换吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   user555045    6 年前

    当切换和的顺序时,警告消失,因此:

    unsigned char r( ( ARGB >> 16) & 0xFF );
    
        2
  •  2
  •   Aconcagua    6 年前

    正如在另一个答案中提到的,更改操作可能会有所帮助,但它还有另一个好处:一致性(如果您考虑删除过时的括号,那么,请稍候):

    unsigned char a( ARGB >> 24         );
    unsigned char r( ARGB >> 16 & 0xffU );
    unsigned char g( ARGB >>  8 & 0xffU ); // same value as above
    unsigned char b( ARGB       & 0xffU ); //      -- " --
    

    unsigned char x(static_cast<unsigned char>(argb >> y & 0xffU));