Почему, когда я запускаю этот код, b в конце преобразуется в 1410065408? Но за 1 шаг до b было 100000000000 и должно быть то же самое (Это калькулятор от dec формы до binnar)
P.S. все шаги программы я смотрела в C visualize
#include<stdio.h>
int binnar(int a){
long long int b = 0, x = 1;
while(a != 0){
b += (a % 2) * x;
x *= 10;
a = a/2;
}
return b;
}
void main(){
int a = 1024;
printf("%lld", binnar(a));
}
Я ожидаю, что b будет 100000000000, а не 1410065408
PSA: не используйте такие типы, как long long int, которые могут сбить с толку, вместо этого используйте int64_t, который совершенно однозначен.
@ Поттер Какой тип b? Какой тип возвращает функция? И какой правильный спецификатор формата для int?
Вы «правильно» использовали типы long long int внутри своей функции (несмотря на комментарий от tadman), но затем вы теряете все эти усилия, возвращая простой int. Голосование за закрытие как опечатка.
В сторону: main() должен вернуть int.
Сделать результирующую строку. Сохранение его в виде десятичного числа, которое выглядит как двоичное, совершенно бессмысленно и сбивает с толку.
%lld
неправильно для int
Добро пожаловать в Stack Overflow. Своими словами, где код говорит int binnar(int a){, как вы думаете, что это значит? В частности, что означает часть int? Можно ли будет получить return значение типа 100000000000 из этой функции? Почему или почему нет?
% — оператор по модулю (возвращает остаток)
Что здесь происходит
А=1024, а%2=0, х=1, б=0
A=512, a%2=0, x=10, b=0 (b не увеличивается, поскольку a%2 равен 0)
И продолжается до тех пор, пока
A=1, a%2=1, x=100000000000, НО, поскольку возвращаемый тип binnar — int, он не работает так, как вы хотите, и он переполняется. Попробуйте изменить тип возврата binnar на long long и посмотрите, работает ли он так, как вы задумали.
Редактировать: добавлен код
#include<stdio.h>
long long int binnar(int a){
long long int b = 0, x = 1;
while(a != 0){
b += (a % 2) * x;
x *= 10;
a = a/2;
}
return b;
}
void main(){
int a = 1024;
printf("%lld", binnar(a));
}
Не совсем правильно. Изменение типа a не является необходимым (результат (a % 2) — int — будет преобразован в более широкий тип x перед этим умножением), и это не исправит ошибку в возвращаемом типе.
Это работает именно так, как задумано --> #include<stdio.h> long long int binnar(int a){ long long int b = 0, x = 1; в то время как (а! = 0) { б + = (а% 2) * х; х *= 10; а = а/2; } вернуть б; } void main(){ int a = 1024; printf("%lld", binnar(a)); }
100000000000
слишком велик для 32-битного целого числа.