C 输出值与执行直接操作时在函数中作为参数接收的值不同
我尝试将11..10..0(这是一个二进制数,小数位中有连续的32-n个零)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
<代码> //可以假设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