int main() { int a = 0x12345678; int b = 0x5555aaaa; char v = *((char *)((a<<64)|b)); return v; } See: http://www.x86-64.org/documentation/assembly Intel x86-64 bit mode output test1: .LFB2: pushq %rbp .LCFI0: movq %rsp, %rbp .LCFI1: movl $305419896, -4(%rbp) movl $1431677610, -8(%rbp) movl -4(%rbp), %eax movl $64, %ecx sall %cl, %eax orl -8(%rbp), %eax cltq movzbl (%rax), %eax movb %al, -9(%rbp) movsbl -9(%rbp),%eax leave ret Intel 32 output: test1: pushl %ebp movl %esp, %ebp subl $12, %esp movl $305419896, -4(%ebp) movl $1431677610, -8(%ebp) movl -4(%ebp), %eax movb $64, %cl sall %cl, %eax orl -8(%ebp), %eax movb (%eax), %al movb %al, -9(%ebp) movsbl -9(%ebp),%eax leave ret ------------------------ Example 2: 64 bit addition. int test2() { int a = 0x12345678; int b = 0x5555aaaa; long long int c = (long long int) a + b; return c >> 24; } ix86-64 test2: .LFB2: pushq %rbp .LCFI0: movq %rsp, %rbp .LCFI1: movl $305419896, -4(%rbp) movl $1431677610, -8(%rbp) movl -4(%rbp), %eax movslq %eax,%rdx movl -8(%rbp), %eax cltq leaq (%rdx,%rax), %rax movq %rax, -16(%rbp) movq -16(%rbp), %rax sarq $24, %rax leave ret Intel 32 bit mode output test2: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp movl $305419896, -12(%ebp) movl $1431677610, -16(%ebp) movl -12(%ebp), %eax movl %eax, %ecx movl %eax, %ebx sarl $31, %ebx movl -16(%ebp), %eax cltd addl %ecx, %eax adcl %ebx, %edx movl %eax, -24(%ebp) movl %edx, -20(%ebp) movl -24(%ebp), %eax movl -20(%ebp), %edx shrdl $24, %edx, %eax sarl $24, %edx addl $20, %esp popl %ebx leave ret