c++; 我有一个关于C++中的位运算的问题,

c++; 我有一个关于C++中的位运算的问题,,c++,bitwise-operators,C++,Bitwise Operators,有一组代码: #define INDEX(SRC, DEST) ((U16)SRC | (DEST << 8)) #定义索引(SRC,DEST)((U16)SRC |(DEST (U16)SRC将SRC类型转换为U16 (DEST它将SRC转换为U16类型,并在左移(8)个位置后执行按位或withDEST。我猜U16也是代码中的某个宏,它可能指定一个16位无符号整数类型(我从缩写中推断).SRC和DST是代码定义的宏扩展的两个参数和(U16)SRC|(DEST对于您显示的代码,这是

有一组代码:

#define INDEX(SRC, DEST) ((U16)SRC | (DEST << 8))
#定义索引(SRC,DEST)((U16)SRC |(DEST
  • (U16)SRC
    SRC
    类型转换为
    U16

  • (DEST它将
    SRC
    转换为
    U16
    类型,并在左移(8)个位置后执行按位或with
    DEST

    我猜U16也是代码中的某个宏,它可能指定一个16位无符号整数类型(我从缩写中推断).SRC和DST是代码定义的宏扩展的两个参数和(U16)SRC|(DEST对于您显示的代码,这是一个很大的猜测:当然,看起来似乎
    U16
    是一个用于
    无符号短字符
    uint16\u t
    的宏。如果您想知道,定义会扩展到包括宏的定义,并在一个简单的测试程序中调用宏:

    #include "whatever-defines-INDEX.h"
    
    INDEX(10, 1)
    

    然后使用
    -E
    选项调用编译器(如果
    -E
    不可用且您使用的是Windows,则调用
    /E
    选项):这会将运行预处理器的结果发送到标准输出。

    SRC类型转换为(我猜)无符号int(16位宽),DEST向左移动8位(与DEST乘以256相同)然后结果进行OR运算,所以它就像
    (SRC |(DEST*256))
    这不是一个非常可靠的宏。用索引(a,b&c)调用它如果不知道运算符的执行顺序,则会产生非常有趣的结果。顺便说一句,千万不要这样编写宏。如果任一参数都是表达式(例如
    索引(s1+s2,d1+d2)
    ),则会产生意外的结果在C++中,对于这样的事情,您几乎总是使用内联函数;如果由于某种原因,您必须使用宏,那么请确保在宏参数的每一个外观上都设置括号。