我试着SQR
在下面的代码中使用宏的定义:
#define SQR(x) (x*x)
int main()
{
int a, b=3;
a = SQR(b+5); // Ideally should be replaced with (3+5*5+3), though not sure.
printf("%d\n",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印23
.如果我将宏定义更改为SQR(x) ((x)*(x))
然后输出是预期的,64
.我知道在C中调用宏会用宏的定义替换调用,但是我仍然无法理解它是如何计算的23
.
我想得到一个函数,将n
数值类型的最后几位设置为1
.例如:
bitmask (5) = 0b11111 = 31
bitmask (0) = 0
Run Code Online (Sandbox Code Playgroud)
我,第一,有此实现(mask_t
只是typedef
周围uint64_t
):
mask_t bitmask (unsigned short n) {
return ((((mask_t) 1) << n) - 1;
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,除非函数命中bitmask (64)
(大小mask_t
),然后我得到bitmask (64) = 0
64位设置为1
.
所以,我有两个问题:
为什么我有这种行为?按下1
左侧的64个移位应该清除寄存器并保持0
,然后应用-1
应该用1
s 填充寄存器...
实现此功能的正确方法是什么?