代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

32位机器上的long long int

  •  12
  • B.Gen.Jack.O.Neill  · 技术社区  · 15 年前

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

    5 回复  |  直到 15 年前
        1
  •  20
  •   Michael Burr    15 年前

    编译器将合成使用多个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位值执行这种类型的操作。 长长 产生了。

        2
  •  9
  •   Femaref    15 年前

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

    struct long
    {
      int32 highWord;
      uint32_t lowWord;
    }
    

    编译器需要知道它是32位还是64位的环境,然后选择数字的正确代表——如果它是64位,则可以在本机上执行,如果它是32位,则编译器必须处理高/低字之间的数学运算。

    如果你看一下math.h,你可以看到用于这个的函数,并自己使用它们。另外,要注意小尾数和大尾数的区别。( see wiki )的使用取决于操作系统。

        3
  •  2
  •   Jens Gustedt    15 年前

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

    另外,您不应该认为标准整数类型有一些指定的宽度。特别是,long long至少是64位,但可能更宽。如果您想方便地确定宽度,请使用typedefs int32_t、int64_t。

    如果您想知道gcc(或任何其他编译器)在长时间内做了什么,您必须研究特定目标平台的规范。

        4
  •  2
  •   Cubbi    15 年前

    如果您有一个32位的系统可以访问,那么只需编译和测试就足够容易了。海湾合作委员会有一面旗帜 -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
    
        5
  •  1
  •   DevSolo    15 年前

    很可能是一个类,而不是本地的。同样,任何编译器都可以/可以支持任何大的数字集。