我正在使用Windows 7 32位计算机,我认为32位操作系统将无法分配64位无符号数。但我尝试过任何方式......在C ++程序中,我编写了以下代码..
#include <iostream>
#include <climits>
using namespace std;
int main() {
unsigned long long i = 0;
cout << i << endl;
return 0;
}
虽然我期待一个错误程序编译并成功运行!但我不明白怎么做!任何人都可以向我解释...提前谢谢:)
答案 0 :(得分:2)
让我们看看它编写的是什么。我已经添加了一些算法来使它更清晰。
6 unsigned long long i = 0;
0x0804868d <+18>: mov DWORD PTR [ebp-0x10],0x0
0x08048694 <+25>: mov DWORD PTR [ebp-0xc],0x0
7 unsigned long long j = 3;
0x0804869b <+32>: mov DWORD PTR [ebp-0x18],0x3
0x080486a2 <+39>: mov DWORD PTR [ebp-0x14],0x0
8 cout << i + j << endl;
0x080486a9 <+46>: mov ecx,DWORD PTR [ebp-0x10]
0x080486ac <+49>: mov ebx,DWORD PTR [ebp-0xc]
0x080486af <+52>: mov eax,DWORD PTR [ebp-0x18]
0x080486b2 <+55>: mov edx,DWORD PTR [ebp-0x14]
0x080486b5 <+58>: add eax,ecx
0x080486b7 <+60>: adc edx,ebx
如您所见,编译器生成两条加载和存储指令。使用adc
(带进位加载)执行加法以将进位位传送到较高部分。
答案 1 :(得分:1)
64位CPU可以将64位无符号数直接加载到寄存器中,而在32位CPU上,它必须一次处理部分数字。 C ++编译器隐藏了这些差异。我们有能力在8位机器上处理64位无符号数字,它只需要更多的周期来完成它。