【发布时间】:2011-04-23 07:28:48
【问题描述】:
我试图了解涉及大于 232 的数字的计算如何在 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 行究竟发生了什么?
这是汇编级别的某种字符串连接吗?
【问题讨论】:
-
使用
pow是计算2 的整数幂的一种非常讨厌且容易出错的方法。不要使用它。请注意,如果您的浮点减法没有作为 80 位long double完成,pow(2,64)-1将等于pow(2,64),然后将其转换为unsigned long long将无法正常工作。