А чего спорить? Проверьте на примере:
Код | long long q; long m = 1, n = 2; int main() { q = ((long long)m << 32) + n; }
|
Код | .comm q,8,8 .globl m .data .align 4 .type m, @object .size m, 4 m: .long 1 .globl n .align 4 .type n, @object .size n, 4 n: .long 2 .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp pushl %ebx movl m, %eax movl %eax, %edx sarl $31, %edx movl %eax, %ecx movl %edx, %ebx movl %ecx, %ebx movl $0, %ecx movl n, %eax movl %eax, %edx sarl $31, %edx addl %ecx, %eax adcl %ebx, %edx movl %eax, q movl %edx, q+4 popl %ebx popl %ebp ret .size main, .-main
|
Сдвиги на 31 бит используются для расширения знака. Нужно было объявить unsigned. Тогда сдвигов не будет, хотя будет ненужное сложение:
Код | unsigned long long q; unsigned long m = 1, n = 2; int main() { q = ((unsigned long long)m << 32) + n; }
|
Код | .comm q,8,8 .globl m .data .align 4 .type m, @object .size m, 4 m: .long 1 .globl n .align 4 .type n, @object .size n, 4 n: .long 2 .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp pushl %ebx movl m, %eax movl $0, %edx movl %eax, %ecx movl %edx, %ebx movl %ecx, %ebx movl $0, %ecx movl n, %eax movl $0, %edx addl %ecx, %eax adcl %ebx, %edx movl %eax, q movl %edx, q+4 popl %ebx popl %ebp ret .size main, .-main
|
|