在 C 中将无符号整数转换为 48 位二进制

标签 c arrays binary bit-manipulation decimal

我想将一个无符号整数转换为一个 48 位二进制表示的数组,如果结果小于 48 位,那么我需要将其余位清零。这是函数:

char *getBinary(unsigned int num)
{
char* bstring;
int i;
bstring = (char*) malloc(sizeof(char) * 49);
assert(bstring != NULL);

bstring[48] = '\0';
for( i = 0; i < 48; i++ )
{
    bstring[48 - 1 - i] = (num == ((1 << i) | num)) ? '1' : '0';
}
return bstring;
}

在主函数中:

unsigned int nbr1=3213816984;
char * bi=getBinary(nbr1);

结果应该是:

000000000000000010111111100011101111010010011000

但是我得到了:

111101001001100010111111100011101111010010011000

为什么我不能将超过 32 位的位清零?

最佳答案

您在 undefined. 中调用的行为。也就是说,C 标准没有规定当您将数字移动到比其默认位宽更远时会发生什么。因此编译器编写者可以为所欲为。

在您的示例中,行为似乎是“环绕”该位,这样 1 << 32 变为 1 << 0,因此高 16 位似乎是低 16 位的重复。

正如@Jonathan Leffler 在评论中提到的,您需要使用足够宽的数据类型来支持您的 48 位方案,或者您需要采取措施将 48 位输入分解为 32 位片段,随心所欲。

编辑:

根据您的评论,我会指出 1是整数文字。它有一个类型。所以表达式的结果 1 << i还有一个类型,它派生自 1 的类型.

如果您想对 unsigned-long-long 数进行运算,最好的办法是尽快将所有内容放入正确类型的一些变量中。

unsigned long long ONE = 1;

ONE << i

替代方案 - 使用常量文字 - 涉及 ULL后缀:

1ULL << i

关于在 C 中将无符号整数转换为 48 位二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444393/

相关文章:

c - 无法理解在 little endian 机器中以 c 语言进行类型转换后产生的输出

c - 在 gdb 中获取指针的地址

javascript - 无法读取未定义错误的属性 'replace'

PHP:递归空多维数组

c++ - 指定二维数组中的特定位置

c - 将 C 文件中的符号导入链接描述文件

c - 在Linux上使用套接字发出https请求

c - C 中二进制表示的按位运算符

mysql - 二进制列的默认值是多少?

python - Python 中十六进制数的二进制补码