非常简单的问题,我读到GCC支持long long int类型.但是,当CPU只有32位宽时,如何使用它进行数学运算?
Mic*_*urr 22
编译器将合成使用多个CPU指令执行操作的数学运算(或使用函数调用).例如,添加操作将添加值的低阶分量(低字),long long然后执行该操作并将其输入到高阶字的加法运算中long long.
所以下面的C代码:
long long a;
long long b;
long long c;
// ...
c = a + b;
Run Code Online (Sandbox Code Playgroud)
可能由一个类似于以下内容的指令序列表示:
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
Run Code Online (Sandbox Code Playgroud)
如果你考虑一下,8位和16位系统的编译器在生成之前很久就必须为16位和/或32位值做这种类型的事情long long.
在内部,类型由高字和低字表示,如:
struct long
{
int32 highWord;
uint32_t lowWord;
}
Run Code Online (Sandbox Code Playgroud)
编译器需要知道它是32位还是64位环境,然后选择正确的数字重新定位 - 如果它是64位,它可以本机完成,如果是32位,编译器必须处理数学之间的数学运算.高/ lowword.
如果您查看math.h,您可以看到用于此的函数,并自己使用它们.另外需要注意的是,请注意little-endian和big-endian(请参阅wiki)之间的区别,用法取决于操作系统.