32位操作系统支持64位无符号整数!!如何?
32 bit operating system supporting 64 bit unsigned integer!! how?
我在 windows 7 32 位计算机上工作,我认为 32 位 OS 将无法分配 64 位无符号数。但我尝试了任何方式...在 C++ 程序中我编写了以下代码..
#include <iostream>
#include <climits>
using namespace std;
int main() {
unsigned long long i = 0;
cout << i << endl;
return 0;
}
尽管我预料程序编译会出错,但 运行 成功!但是我不明白怎么办!谁能给我解释一下...提前致谢:)
64 位 CPU 可以将 64 位无符号数直接加载到寄存器中,而在 32 位 CPU 上它必须一次处理部分数字. C++ 编译器向您隐藏了这些差异。我们有能力在 8 位机器上处理 64 位无符号数,只是需要更多的周期才能完成。
让我们看看它编译成什么。我添加了一些算术以使其更清楚。
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
(add with carry)将进位位进位到高位进行的。
我在 windows 7 32 位计算机上工作,我认为 32 位 OS 将无法分配 64 位无符号数。但我尝试了任何方式...在 C++ 程序中我编写了以下代码..
#include <iostream>
#include <climits>
using namespace std;
int main() {
unsigned long long i = 0;
cout << i << endl;
return 0;
}
尽管我预料程序编译会出错,但 运行 成功!但是我不明白怎么办!谁能给我解释一下...提前致谢:)
64 位 CPU 可以将 64 位无符号数直接加载到寄存器中,而在 32 位 CPU 上它必须一次处理部分数字. C++ 编译器向您隐藏了这些差异。我们有能力在 8 位机器上处理 64 位无符号数,只是需要更多的周期才能完成。
让我们看看它编译成什么。我添加了一些算术以使其更清楚。
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
(add with carry)将进位位进位到高位进行的。