c - 打印数字的二进制表示

标签 c bit-manipulation bit

我想打印 int 的二进制表示。我的解决方案似乎适用于 Visual Studio 中的 intunsigned int,但有人告诉我这是错误的。有人看到错误吗?如果是这样,为什么我的程序似乎对我有用?

void printbin(int n)
{
    unsigned int i = 1<<31;

    for (int j=0; j<32; j++)
    {
        if ((n & i) != 0)
            printf("1");
        else
            printf("0");
        i = i>>1;
    }

    printf("\n");
}

最佳答案

1<<31将一位传递给值位并可能移入符号(或填充)位。这是 C 中的未定义行为。

n & i正在尝试“和”unsigned int 的位和 signed int 的标志.

OP 对 32 的使用假设 int是 32 位宽。

以下是打印符号和可变位数的示例 - 有效 [INT_MIN...INT_MAX] .

#include <limits.h>
void printbin_c(int n) {
  char buf[CHAR_BIT * sizeof n + 1];
  char *p = &buf[sizeof buf - 1];
  *p = '\0';

  int i = n;
  if (i > 0) {
    i = -i;
  }

  do {
    p--;
    *p = '0' - i%2;
    i /= 2;
  } while (i);

  if (n < 0) {
    p--;
    *p = '-';
  }

  puts(p);
}

[编辑] 处理 1 的补码 @John Bollinger

使用 if (i > 0) i = -i; 的负绝对值因为正绝对值不适用于 INT_MIN 2 的补码。

关于c - 打印数字的二进制表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29782533/

相关文章:

c - 在 C 中更改了 boolean 类型的值

c++ - 具有非八位字节对齐子字段的 96 位长位字段

c - 与左移运算符 (<<) 的结果不一致

javascript - JavaScript 文本的位长

c - 插入循环链表(输出未按预期输出)

c - write() 返回 errno 14 为什么?

c - 在 C 中是否有等价的 & 表达式 >> 31

c++ - 如何交换字节半字节?

linux - 如何检查我的服务器 Diffie-Hellman MODP 大小(位)并增加它?

c - 这是一个有效的 Tic Tac Toe 获胜条件检查器功能吗?