我想将一个无符号整数转换为一个 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/