我的目标是得到一个与用户指定的二进制前导相同的十进制,它存储在unsigned long
变量mask
中;其余位将设置为零。
int mask;
scanf("%d",&mask);
unsigned long subnetMask = 0;
int counter = 31,a;
for(int a = mask, a > 0; a--) {
subnetMask += pow(2,counter);
counter--;
}
printf("%ld",subnetMask);
现在,当用户输入 24 时,掩码的二进制字符串为 11111111 11111111 11111111 00000000,我正在尝试将其转换为基数 10。
它没有给我正确的输出 4294967040,而是给了我 -128。我知道某些部分存在内存溢出,但我不知道在哪里。我尝试了多种方法,例如将 subnetMask
的数据类型替换为 int
和 long
。
最佳答案
在 32 位或更大的机器上,您可以不循环地解决原始问题:
unsigned long subnetMask = mask ? - (1<<(32 - mask)) : 0;
此外,subnetMask 在 32 位计算机上不必太长。这段代码显示了表达式的正确性:
for(int mask = 0; mask < 33; mask++)
{
unsigned subnetMask = mask ? - (1<<(32 - mask)) : 0;
printf("%2d => %08x = %u (decimal)\n", mask, subnetMask, subnetMask );
}
关于c - 无法将二进制转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41842180/