Warning: integer constant is too large for "long" type - C (СИ)
Формулировка задачи:
Можете пояснить и написать, что нужно сделать в коде, чтобы компилятор не выдавал следующие предупреждения:
warning: integer constant is too large for "long" type;
warning: comparison is always true due to limited range of data type.
#include<stdio.h>
main (void)
{
long int i, l;
printf("Vvedite dvoichnoe chsislo: ");
scanf("%d", &i);
if(i==0 || i==1)
{
l=i*1;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=10 && i<100)
{
l=(i%10)*1+(i-i%10)/10;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=100 && i<1000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i-i%100)/100)*4;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=1000 && i<10000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i%1000-i%100)/100)*4+((i-i%1000)/1000)*8;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=10000 && i<100000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i%1000-i%100)/100)*4+((i%10000-i%1000)/1000)*8;
l=l+((i-i%10000)/10000)*16;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=100000 && i<1000000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i%1000-i%100)/100)*4+((i%10000-i%1000)/1000)*8;
l=l+((i%100000-i%10000)/10000)*16+((i-i%100000)/100000)*32;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=1000000 && i<10000000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i%1000-i%100)/100)*4+((i%10000-i%1000)/1000)*8;
l=l+((i%100000-i%10000)/10000)*16+((i%1000000-i%100000)/100000)*32;
l=l+((i-i%1000000)/1000000)*64;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=10000000 && i<100000000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i%1000-i%100)/100)*4+((i%10000-i%1000)/1000)*8;
l=l+((i%100000-i%10000)/10000)*16+((i%1000000-i%100000)/100000)*32;
l=l+((i%10000000-i%1000000)/1000000)*64+((i-i%10000000)/10000000)*128;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=100000000 && i<1000000000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i%1000-i%100)/100)*4+((i%10000-i%1000)/1000)*8;
l=l+((i%100000-i%10000)/10000)*16+((i%1000000-i%100000)/100000)*32;
l=l+((i%10000000-i%1000000)/1000000)*64+((i%100000000-i%10000000)/10000000)*128;
l=l+((i-i%100000000)/100000000)*256;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
if(i>=1000000000 && i<10000000000)
{
l=(i%10)*1+((i%100-i%10)/10)*2+((i%1000-i%100)/100)*4+((i%10000-i%1000)/1000)*8;
l=l+((i%100000-i%10000)/10000)*16+((i%1000000-i%100000)/100000)*32;
l=l+((i%10000000-i%1000000)/1000000)*64+((i%100000000-i%10000000)/10000000)*128;
l=l+((i%1000000000-i%100000000)/100000000)*256+((i-i%1000000000)/1000000000)*512;
printf("Chislo %d v desyatichnoy forme: %d\n", i, l);
}
printf("\n");
return 0;
}Решение задачи: «Warning: integer constant is too large for "long" type»
textual
Листинг программы
int ConvertToDecimal(int number)
{
int count = 0, result = 0;
do
{
int mod = number % 10;
result += pow(2, count)*mod;
count++;
number /= 10;
}while(number);
return result;
}
Объяснение кода листинга программы
- В функции
ConvertToDecimalприведена реализация алгоритма преобразования числа из двоичной системы счисления в десятичную. - Переменная
countинициализируется значением 0 и используется для подсчёта количества цифр в числе, которое будет преобразовано. - Переменная
resultинициализируется значением 0 и используется для хранения результата преобразования. - В цикле
do-whileпроисходит последовательное преобразование каждой цифры числа в двоичную систему счисления с помощью операции остатка от деления%и последующим добавлением полученного значения в переменнуюresult. - Переменная
countувеличивается на единицу после каждой итерации цикла. - Переменная
numberделится на 10 после каждой итерации цикла. - Цикл выполняется до тех пор, пока число
numberне станет равным нулю. - Функция возвращает результат преобразования в виде десятичного числа.