打印二进制数给出奇怪的结果
问题描述:
我正在审查按位运算符,并写了一个简单的代码来打印数字的二进制表示,但我有疯狂的输出,我没有解释它。为什么程序不给我正确的二进制数? 下面是示例输出:打印二进制数给出奇怪的结果
和我的代码:
#include <stdio.h>
#include <stdlib.h>
void pBinary(int x);
int main(void)
{
for (int n = 0; n < 20; n++) {
pBinary(n);
}
return 0;
}
void pBinary(int x)
{
int y = 1 << 31;
for (int n = 0; n < 32; n++) {
x & y ? putchar('1') : putchar('0');
y >>= 1;
}
putchar('\n');
}
答
如果int
是32位长,1 << 31
将调用符号整数溢出,这是未定义的行为。
考虑使值处理无符号。
void pBinary(unsigned int x)
{
unsigned int y = 1u << 31;
for (int n = 0; n < 32; n++) {
x & y ? putchar('1') : putchar('0');
y >>= 1;
}
putchar('\n');
}
使用具有定义大小的类型更安全。包括inttypes.h
或stdint.h
以使用uint32_t
。
void pBinary(uint32_t x)
{
uint32_t = UINT32_C(1) << 31;
for (int n = 0; n < 32; n++) {
x & y ? putchar('1') : putchar('0');
y >>= 1;
}
putchar('\n');
}
答
在这里,你已经左移位数1..31的地方。当然,默认情况下会发生溢出,它会在有符号的数字上执行。
#include <stdio.h>
#include <stdlib.h>
void pBinary(int x);
int main(void)
{
for (int n = 0; n < 20; n++) {
pBinary(n);
}
return 0;
}
void pBinary(int x)
{
unsigned int y = (1u << 31); //avoid overflow
for (int n = 0; n < 32; n++) {
(x & y) ? putchar('1') : putchar('0');
y >>= 1;
}
putchar('\n');
}
+0
yikes..gotcha。注意到并纠正了.Thx – coderredoc
请勿发布图片的文字!你的代码调用_undefined behaviour_,见标准6.5.7。 – Olaf