我想打印 int
的二进制表示。我的解决方案似乎适用于 Visual Studio 中的 int
和 unsigned 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/