【发布时间】:2015-01-12 01:16:58
【问题描述】:
我需要一个函数来打印带符号 int 的二进制表示,我有以下对负整数和正整数都有效的函数,因为1 << 31 = 2147483648 的无符号值,这是一种有效的方法吗? ?
#include <stdio.h>
void printBinary(int n) {
for (unsigned i = 1 << 31; i > 0; i = i >> 1) {
if (i & n) {
printf("1");
} else {
printf("0");
}
}
printf("\n");
}
int main() {
printBinary(2147483647); // 01111111111111111111111111111111
printBinary(-2147483647); // 10000000000000000000000000000001
printBinary(-2147483648); // 10000000000000000000000000000000
printBinary(2147483648); // can't be represented, will produce wrong results
return 0;
}
【问题讨论】:
-
std::bitset::to_string()恕我直言,这是最简单的方法。 -
因为它大于有符号整数...
-
如果
printBinary将unsigned int作为参数,您可能会更开心。有符号整数以可预测的方式转换为无符号整数;反之则不成立(有符号整数溢出表现出未定义的行为)。 -
是的,它打印错误的结果,我会改变它
-
@IgorTandetnik 将无符号整数转换为有符号整数不是 UB,而是最多定义的实现。见 [conv.integral]/3。