2017-01-25 1 views
3

Моя цель состоит в том, чтобы иметь десятичный код, который имеет одни и те же ведущие в двоичном формате, как указывает пользователь, который хранится в переменной unsigned longmask; остальные биты будут установлены на ноль.Невозможно преобразовать двоичный код в десятичный

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.

+2

% d для целых чисел со знаком. try 'printf ("% lu ", subnetMask);' – bruceg

+1

Обратите внимание, что вы никогда не используете 'mask' после считывания значения из ввода. – kaylum

+1

% lu исправлена ​​проблема. И условие цикла изменилось, и теперь оно работает. Спасибо, парень. – dave

ответ

1

Пара вещей:

  1. %ld спецификатор формата ожидает signed int. Число 0b11111111111111111111111100000000 определенно выглядит как отрицательное число, если оно интерпретируется как подписанное число в дополнении, так как левая часть битовой строки равна 1 с, поэтому неудивительно, что вход «4294967040» напечатан как -128. То, что вы ищете, это спецификатор формата %lu.

  2. pow возвращает double, а не int или unsigned long. Вероятно, вы хотите, чтобы результат pow был равен int, или еще лучше, просто используйте 1UL << counter, чтобы получить тот же результат, что и unsigned long.

2

Вы можете решить исходную проблему без зацикливания, на 32-битных или больших машинах:

unsigned long subnetMask = mask ? - (1<<(32 - mask)) : 0; 

Кроме того, Маска_подсеть не должен быть длинным на 32-разрядных машинах. Правильность выражения показана с помощью этого кода:

for(int mask = 0; mask < 33; mask++) 
{ 
    unsigned subnetMask = mask ? - (1<<(32 - mask)) : 0; 

    printf("%2d => %08x = %u (decimal)\n", mask, subnetMask, subnetMask); 
} 
Смежные вопросы