Почему первый занимает меньше байтов, чем второй?
Хотя ответ Питера Кордеса уже о технических деталях, я бы хотел сосредоточиться на математическом фоне:
x86s CPU, очевидно, не различает большие числа (например, 12345789) и нулевое значение: для хранения такого значения требуется 4 байта.
Однако нулевое значение является очень специальным значением:
Он может быть записан как (aa) или как (a XOR a), а «a» может быть любым целочисленным значением!
Это означает, что вы можете выполнить трюк:
Вы выполняете операцию subq %rcx, %rcx
для вычисления значения (rcx - rcx)
.Неважно, какое значение имеет rcx
: если вы вычтите это значение из себя, результат будет нулевым (потому что (aa) = 0).
Это означает, что rcx
будет 0 после этогооперация.
Операция xorq %rcx, %rcx
имеет тот же эффект, поскольку (XOR a) также всегда равно 0.