C++ 32位机器上的长整型

C++ 32位机器上的长整型,c++,c,types,C++,C,Types,非常简单的问题,我读到GCC支持长整型。但是,当CPU只有32位宽时,如何使用它进行数学运算呢?很可能是作为一个类,而不是本机。与任何编译器支持任何大数集的方式相同。在内部,类型由一个高字和一个低字表示,如: struct long { int32 highWord; uint32_t lowWord; } 编译器需要知道它是32位还是64位环境,然后选择正确的数字表示-如果是64位,则可以本机完成,如果是32位,编译器必须处理高/低字之间的数学关系 如果你看一下math.h,你可以看

非常简单的问题,我读到GCC支持长整型。但是,当CPU只有32位宽时,如何使用它进行数学运算呢?

很可能是作为一个类,而不是本机。与任何编译器支持任何大数集的方式相同。

在内部,类型由一个高字和一个低字表示,如:

struct long
{
  int32 highWord;
  uint32_t lowWord;
}
编译器需要知道它是32位还是64位环境,然后选择正确的数字表示-如果是64位,则可以本机完成,如果是32位,编译器必须处理高/低字之间的数学关系


如果你看一下math.h,你可以看到用于这个的函数,并且自己使用它们。另外,请注意little-endian和big-endian()之间的区别,用法取决于操作系统。

编译器将合成使用多条CPU指令执行操作的数学操作(或使用函数调用)。例如,添加操作将添加
long
值的低位分量(低位字),然后执行该操作并将其输入到
long
的高位字上的添加操作中

下面是C代码:

long long a;
long long b;
long long c;

// ...
c = a + b;
可能由如下所示的指令序列表示:

mov eax, [a.low]   ; add the low order words
add eax, [b.low]

mov edx, [a.high]  ; add the high order words, 
adc edx, [b.high]  ; including the carry 

mov [c.low], eax
mov [c.high], edx

如果你考虑一段时间,8位和16位系统的编译器必须在16版和/或32位值之前做这类事情,在<代码>长Lo/<代码>之前。

< p>说一个体系结构是32位(或64个或任何一个)通常只是处理器能做的近似。通常您只使用该数字来表示指针的宽度,算术可能会有很大的不同。例如,x86体系结构有32位指针,大多数算法在32位寄存器中执行,但它也有一些基本64位操作的本机支持。

此外,您也不应该给人留下标准整数类型具有某些规定宽度的印象。特别是long long至少为64位,但可能更宽。如果您想方便地确定宽度,请使用typedefs int32\u t和int64\u t。

如果您想知道gcc(或任何其他编译器)在long-long中做了什么,您必须查看特定目标平台的规范

如果您有一个可访问的32位系统,只需编译和测试就很容易了。gcc有一个标志
-S
,它打开汇编语言输出。以下是它在我的32位intel上产生的结果:

// read two long longs from stack into eax:edx and ecx:ebx
movl    32(%esp), %eax
movl    36(%esp), %edx
movl    24(%esp), %ecx
movl    28(%esp), %ebx
// a+b
addl    %ecx, %eax
adcl    %ebx, %edx
// a-b
subl    %ecx, %eax
sbbl    %ebx, %edx
// etc

另外两件事:第一,此结构的顺序依赖于机器顺序。第二,在此结构上操作的函数调用对您可用。它们是在math.h.thirs中声明的
lowByte
实际上应该是
uint32\u t
:-p在这个上下文中,术语是“word”而不是“byte:)好吧,再多说一句,如果它是一个结构,我如何在没有任何头文件的情况下使用它,就像任何其他数据类型一样?(Visual C++ 2010表示)