我尝试生成 11..10..0(这是带有连续 32-n 个小数字零的二进制数)。
// Can assume that 0 <= n <= 31
int masking(int n) {
return (~0)<<(~n+33);
}
但是,当我输入0
时在输入 n 中,我期望 0
,但我得到了 -1(0xffffffff)
.
不使用输入,
(~0)<<(~0+33)
给出0
.(-1)<<32
还给出0
.
我不知道为什么我得到了不同的结果。
最佳答案
您可能需要考虑强制使用 64 位数学。根据“C”标准,只有当移位次数小于变量的大小(0..N-1)时,才定义变量移位 N 位的结果
在 (~0)(整数,通常为 32 位)上执行移位,将导致 ~n+33 (n=0) 出现未定义的行为,因为 ~n+33 = 32,高于 31 的限制。
更改代码以使用 (~0L) 生成请求的结果 masking(0) = 0
假设您在通用 Linux 上运行 - gcc 将默认为 32 位整数、64 位长和 64 位指针。
include <stdio.h>
int masking(int n) {
return (~0UL)<<(~n+33);
}
void main(void)
{
for (int i=0 ; i<4 ; i++) {
printf("M(%d)=%x\n", i, masking(i)) ;
}
}
输出:
M(0)=0
M(1)=80000000
M(2)=c0000000
M(3)=e0000000
关于c - 执行直接操作时,输出值与函数内作为参数接收的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58154077/