这源于今天早些时候关于bignum图书馆和gcc特定的C语言攻击主题的问题。具体来说,使用了这两个声明:
typedef unsigned int dword_t __attribute__((mode(DI)));
在32位系统上
typedef unsigned int dword_t __attribute__((mode(TI)));
在64位系统上。
我认为,鉴于这是C语言的扩展,无法实现当前(C99)标准中的任何目标。
所以我的问题很简单:这个假设是否正确?这些陈述对底层内存有何影响?我认为结果是我在32位系统中2*sizeof(uint32_t)
和64位系统dword
,我是否正确?
答案 0 :(得分:27)
这些允许您显式指定类型的大小,而不依赖于编译器或机器语义,例如“long”或“int”的大小。
他们的描述相当不错on this page。
我引用那页:
QI:一个宽的整数 最小的可寻址单元,通常为8 位。
HI:一个整数,宽度的两倍 QI模式整数,通常为16位。
SI:一个整数,是QI的四倍宽 模式整数,通常为32位。
DI:An 整数,是QI的八倍宽 模式整数,通常为64位。
SF:A 浮点值,与SI一样宽 模式整数,通常为32位。 DF:A 浮点值,与DI一样宽 模式整数,通常为64位。
所以DI
基本上是sizeof(char) * 8
。
可以找到TI
模式的进一步说明here(可能比第一个链接更好,但都提供参考)。
所以TI
基本上是sizeof(char) * 16
(128位)。
答案 1 :(得分:2)
@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.