как работает унарный оператор +?

Мне нужно знать как он работает на низком уровне когда я пишу a + b что происходит?

вопрос вроде простой но и сложный одновременно.

int main() {
 int a, b, c;
 a = 3;
 b = 2;
 c = 0;

 c = (a + b); // мне нужно знать как он считает, что делает программа с данными 3 и 2 что бы сложить их вместе.

 return 0;
}

Ответы (2 шт):

Автор решения: HasmikGaryaka

Сложение двоичных чисел происходит так же, как десятичных. Цифры складываются, начиная с меньшего разряда. Если сумма больше 1, то происходит перенос.

 101
 110
----
1011
→ Ссылка
Автор решения: AlexGlebe

Чтобы узнать реалезацию как считает, посмотрите ассемблерный код. Можно в интернете компиляторы попросить или самому. Слово volatile - запрещает оптимизировать переменые вплоть до вычёркивания данного кода.

// g++ -Os -S asmsum.cpp
int main() {
 volatile int a, b, c;
 a = 3;
 b = 2;
 c = 0;

 c = (a + b); // мне нужно знать как он считает, что делает программа с данными 3 и 2 что бы сложить их вместе.

 return 0;
}

Вот как g++ может реализовать.

.file   "asmsum.cpp"
.text
.section    .text.startup,"ax",@progbits
.globl  main
.type   main, @function
main:
.LFB0:
.cfi_startproc
movl    $3, -12(%rsp) // заносить в стек числа : a
movl    $2, -8(%rsp) // : b
movl    $0, -4(%rsp) // : c
movl    -12(%rsp), %eax // копирует из стека в регистры
movl    -8(%rsp), %edx
addl    %edx, %eax // складывает
movl    %eax, -4(%rsp) // заносит результат в стек : c
xorl    %eax, %eax // значение регистра eax обнуляет
// main возвращает ноль : всё окей
ret
.cfi_endproc
.LFE0:
.size   main, .-main
.ident  "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section    .note.GNU-stack,"",@progbits
→ Ссылка