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

在C语言中将无符号整数转换为48位二进制,c,arrays,binary,bit-manipulation,decimal,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[4

我想把一个无符号整数转换成一个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位的位归零

在未定义中调用的行为。也就是说,C标准没有规定当您将一个数字移到比其默认位宽度更远的位置时会发生什么情况。因此编译器编写者可以做任何他们想做的事情


在您的示例中,行为似乎是“环绕”位,例如1,因为
unsigned int num
是32位的量。在移位之前,您必须强制转换为64位的数量,例如
无符号long
。@JonathanLeffler您好,谢谢您的回复!我尝试使用unsigned long long,但仍然得到相同的结果。您必须更改函数的接口,使其接受64位(或大于32位)值-在任何正常平台上,您基本上永远不会获得超过32位的值。在
1中的
1
嗨,非常感谢你,我尝试了num==((1all-Hmmm…这是一个不寻常的习惯用法(我不记得以前见过),但我猜
num==((1ll)
unsigned long long ONE = 1;

ONE << i
1ULL << i