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)个位置后执行按位或withDEST
。我猜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++中,对于这样的事情,您几乎总是使用内联函数;如果由于某种原因,您必须使用宏,那么请确保在宏参数的每一个外观上都设置括号。