24

这源于今天早些时候关于 bignum 库和 gcc 对 C 语言的特定黑客攻击的问题。具体来说,使用了这两个声明:

typedef unsigned int dword_t __attribute__((mode(DI)));

在 32 位系统和

typedef unsigned int dword_t __attribute__((mode(TI)));

在 64 位系统上。

我假设这是对 C 语言的扩展,因此无法实现它在当前(C99)标准中实现的任何目标。

所以我的问题很简单:这个假设是否正确?这些语句对底层内存有什么作用?我认为结果是我有2*sizeof(uint32_t)32dword位系统和2*sizeof(uint64_t)64 位系统,对吗?

4

2 回答 2

30

这些允许您显式指定类型的大小,而不依赖于编译器或机器语义,例如“long”或“int”的大小。

在此页面上对它们进行了很好的描述。

我从该页面引用:

QI:与最小可寻址单元一样宽的整数,通常为 8 位。

HI:整数,宽度是 QI 模式整数的两倍,通常为 16 位。

SI:整数,宽度是 QI 模式整数的四倍,通常为 32 位。

DI:整数,宽度是 QI 模式整数的 8 倍,通常为 64 位。

SF:浮点值,与 SI 模式整数一样宽,通常为 32 位。

DF:浮点值,与DI模式整数一样宽,通常为64位。

DI本质上也是如此sizeof(char) * 8

进一步的解释,包括TI模式,可以在这里找到(可能比第一个链接更好,但都提供了参考)。

TI本质上也是如此sizeof(char) * 16(128位)。

于 2010-12-30T00:21:15.437 回答
3

@haelix 刚刚阅读了这个问题,我也试图理解这件事。通过我的阅读:您可以在 GCC 源代码树的 [gcc/gcc/machmode.def] 中找到定义。对于“SD”,它应该是:

    /* Decimal floating point modes.  */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);

和“DECIMAL_FLOAT_MODE”说:

     DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT);
declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes
wide.  All of the bits of its representation are significant.
于 2015-02-14T16:04:57.397 回答