c - 执行直接操作时,输出值与函数内作为参数接收的值不同

标签 c

我尝试生成 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/

相关文章:

c++ - 从 Matlab 调用 Cpp 项目

c# - zlib.c Adler 实现和 Deflate、Ionic Deflate 之间的 Zlib 压缩差异

c - 如何使用 sscanf 返回参数

C - 将指针作为指向另一个函数的指针传递

c - 希腊字符串的长度大于应有的长度

c - 'char' 指针的奇怪行为

c - 如何在执行过程中向文本文件添加信息? C

c - 为什么我的 DEBUG_PRINT 宏没有在包含它的 c 文件中被调用

c - malloc 如何在多线程环境中工作?

c - 读取文件时如何更改数组值