как работает унарный оператор +?
Мне нужно знать как он работает на низком уровне когда я пишу
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