Почему b превращается в другое число?

Почему, когда я запускаю этот код, 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

100000000000 слишком велик для 32-битного целого числа.
tkausl 14.02.2023 17:22

PSA: не используйте такие типы, как long long int, которые могут сбить с толку, вместо этого используйте int64_t, который совершенно однозначен.

tadman 14.02.2023 17:23

@ Поттер Какой тип b? Какой тип возвращает функция? И какой правильный спецификатор формата для int?

Haris 14.02.2023 17:23

Вы «правильно» использовали типы long long int внутри своей функции (несмотря на комментарий от tadman), но затем вы теряете все эти усилия, возвращая простой int. Голосование за закрытие как опечатка.

Adrian Mole 14.02.2023 17:25

В сторону: main() должен вернуть int.

Haris 14.02.2023 17:26

Сделать результирующую строку. Сохранение его в виде десятичного числа, которое выглядит как двоичное, совершенно бессмысленно и сбивает с толку.

Eugene Sh. 14.02.2023 17:31
%lld неправильно для int
ikegami 14.02.2023 17:34

Добро пожаловать в Stack Overflow. Своими словами, где код говорит int binnar(int a){, как вы думаете, что это значит? В частности, что означает часть int? Можно ли будет получить return значение типа 100000000000 из этой функции? Почему или почему нет?

Karl Knechtel 14.02.2023 17:36
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
4
8
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

% — оператор по модулю (возвращает остаток)

Что здесь происходит

А=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 перед этим умножением), и это не исправит ошибку в возвращаемом типе.

Adrian Mole 14.02.2023 17:37

Это работает именно так, как задумано --> #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)); }

SoulSlayer 14.02.2023 17:46

Другие вопросы по теме