2014-09-24 5 views
2

Это простая программа для преобразования положительного десятичного числа в двоичное. Я должен сообщать и останавливать преобразование тех чисел, которые могут вызвать переполнение или ошибочные результаты. Я обнаружил, что размер целого составляет 4 байта, но он преобразуется правильно только до 1023. Я смущаюсь, откуда пришел номер «1023»? Есть ли какой-либо метод для расчета, поэтому я могу предсказать, какой будет правильный диапазон, если, скажем, я программирую на другой системе.Целочисленный диапазон и переполнение

#include<stdio.h> 
int main(void) 
{ 
int decimal,binary=0,y,m=1; 
scanf("%d",&decimal); 
if(decimal<=1023) 
{ 
    while(decimal>0) 
{ 
    y=decimal%2; 
    binary=binary+(m*y); 
    m=m*10; 
    decimal=decimal/2; 
} 
printf("\nBinary Equivalent is: %d",binary); 
} 
else 
    {printf("Sorry, The Number You've entered exceeds the maximum allowable range for  conversion");} 
getch(); 
return 0; 

}

+0

Может ли _could_ использовать 'if (decimal <= 2047) ... m = m * 8; ... "Двоичный эквивалент:% o" 'для еще одной цифры. – chux

ответ

4

1 023 равна 1024-1 (2^10) -1, так что число меньше, чем или равно 1023 будет иметь 10 цифр в базе 2. Так как вы используете int для получения результата он сохраняет до 2^31-1 = 2147483647 (31, потому что один из 32 бит используется для представления знака (+ или -)). Когда у вас есть номер 1024 или более, он использует более 10 цифр - и, таким образом, превышает 2147483647.

Надеюсь, что это поможет.

0

Фактически, диапазон целых чисел находится между [-2^31, 2^31-1]. Потому что есть 4 байта (т. Е. 32 бита). Однако, если вы хотите отсканировать неотрицательное целое число. вы должны инициализировать unsigned int rather int. Диапазон будет [0, 2^32-1].

0

Проблема заключается во временных переменных binary и m вы используете. Поскольку 1024 будет принимать 11 дивизий, чтобы стать 0, m станет 10.000.000.000. Однако максимальное значение int равно 2.147.483.647 (так как один бит из четырех байтов используется как знаковый бит). m, таким образом, переполняется, что приводит к некорректному результату. 1023 или меньше значения будут принимать 10 делений или меньше, чтобы стать 0, поэтому m составляет максимум 1.000.000.000, поэтому m не имеет переполнения.

0

Вы, кажется, хотите взять 4-байтовое десятичное число и преобразовать его в двоичную строку 0 и 1. Метод, используемый в коде терпит неудачу, когда десятичное число> 1023. Здесь преобразование, которое производит строку 0 и 1, которые могут быть распечатаны с помощью:

printf("\nBinary Equivalent is: "); 

while(int i = 0; i < 32; i++) 
{ 
    printf("%c", (decimal & (1<<i))? '1': '0'); 
} 
printf("\n"); 

Это устраняет большую часть кода беспорядка и производит желаемый выпуск.

Смежные вопросы