Как числа больше 2 ^ 32 обрабатываются на 32-битной машине?

Я пытаюсь понять, как вычисления с числами больше 2 32 происходят на 32-битной машине.

C-код

$ cat size.c
#include<stdio.h>
#include<math.h>

int main() {

    printf ("max unsigned long long = %llu\n",
    (unsigned long long)(pow(2, 64) - 1));
}
$

вывод gcc

$ gcc size.c -o size
$ ./size
max unsigned long long = 18446744073709551615
$

Соответствующий ассемблерный код

$ gcc -S size.c -O3
$ cat size.s
    .file   "size.c"
    .section    .rodata.str1.4,"aMS",@progbits,1
    .align 4
.LC0:
    .string "max unsigned long long = %llu\n"
    .text
    .p2align 4,,15
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $-1, 8(%esp)   #1
    movl    $-1, 12(%esp)  #2
    movl    $.LC0, 4(%esp) #3
    movl    $1, (%esp)     #4
    call    __printf_chk
    leave
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
    .section    .note.GNU-stack,"",@progbits
$

Что именно происходит в строках 1–4?

Это какая-то конкатенация строк на уровне сборки?

7
задан Lazer 10 October 2010 в 14:47
поделиться