C 输出值与执行直接操作时在函数中作为参数接收的值不同

C 输出值与执行直接操作时在函数中作为参数接收的值不同,c,C,我尝试将11..10..0(这是一个二进制数,小数位中有连续的32-n个零) //可以假设0 您可能需要考虑强制64位数学。根据“C”标准,只有当移位的数量小于变量的大小(0..N-1)时,才定义具有N位的变量移位的结果 对(~0)(整数,通常为32位)执行移位将导致~n+33(n=0)的未定义行为,因为~n+33=32超出了31的限制 更改代码以使用(~0L)生成请求的结果屏蔽(0)=0 假设您在通用Linux上运行,gcc将默认为32位整数、64位长和64位指针 include <s

我尝试将11..10..0(这是一个二进制数,小数位中有连续的32-n个零)


<代码> //可以假设0 您可能需要考虑强制64位数学。根据“C”标准,只有当移位的数量小于变量的大小(0..N-1)时,才定义具有N位的变量移位的结果

对(~0)(整数,通常为32位)执行移位将导致~n+33(n=0)的未定义行为,因为~n+33=32超出了31的限制

更改代码以使用(~0L)生成请求的结果屏蔽(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)) ;
        }
}

~0
-1
。将
-1
移到左边是。你应该移到unsigned int。你为什么要计算
(~n+33)
,而你的意思是
(32-n)
?对于我的作业,只有“!~&^ |+>“允许操作员使用。有关其他技术讨论,请参阅:
~0L
仍有签名,因此将其向左移动是未定义的行为。”。
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