支持64位无符号整数的32位操作系统!!怎么样?

时间:2016-01-30 13:05:04

标签: c++ integer 64-bit 32bit-64bit unsigned

我正在使用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;
}

虽然我期待一个错误程序编译并成功运行!但我不明白怎么做!任何人都可以向我解释...提前谢谢:)

2 个答案:

答案 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位无符号数字,它只需要更多的周期来完成它。