C语言中的字和双字整数

C语言中的字和双字整数,c,assembly,types,platform-independent,C,Assembly,Types,Platform Independent,我正在尝试用C实现一个简单、中等效率的bignum库。我希望使用编译它的系统的完整寄存器大小(大概是32或64位整数)来存储数字。我的理解是,我可以使用intptr\t实现这一点。这是正确的吗?是否有语义上更合适的类型,例如intword\u t 我还知道,使用GCC,我可以轻松地在32位机器上执行溢出检测,方法是将两个参数上溯到64位整数,这将占用两个寄存器,并利用IA31 ADC(带进位的加法)等指令。我可以在64位机器上执行类似操作吗?是否有一个128位的类型我可以向上转换,如果这些指令可

我正在尝试用C实现一个简单、中等效率的bignum库。我希望使用编译它的系统的完整寄存器大小(大概是32或64位整数)来存储数字。我的理解是,我可以使用intptr\t实现这一点。这是正确的吗?是否有语义上更合适的类型,例如intword\u t

我还知道,使用GCC,我可以轻松地在32位机器上执行溢出检测,方法是将两个参数上溯到64位整数,这将占用两个寄存器,并利用IA31 ADC(带进位的加法)等指令。我可以在64位机器上执行类似操作吗?是否有一个128位的类型我可以向上转换,如果这些指令可用的话,我可以编译到它来使用它们?更好的是,是否有一种表示两倍寄存器大小的标准类型(如intdoubleptr_t)可以以独立于机器的方式实现


谢谢

我强烈建议使用C99
标题。它声明了
int32\u t
int64\u t
uint32\u t
uint64\u t
,它们看起来像您真正想要使用的

编辑:正如Alok指出的,
int\u fast32\u t
int\u fast64\u t
等可能是您想要使用的。指定的位数应为数学运算所需的最小位数,即计算不“翻滚”

这种优化来自这样一个事实:CPU不必浪费周期来重新排列数据、在读取时填充前导位以及在写入时执行读修改写。事实上,很多处理器(比如最近的x86)的CPU中都有硬件,可以很好地优化这些访问(至少是填充和读修改写部分),因为它们非常常见,通常只涉及处理器和缓存之间的传输

因此,您要做的唯一一件事就是确保访问是对齐的:取
sizeof(int\u fast32\u t)
或任何东西,并使用它来确保缓冲区指针与之对齐


事实是,这可能不会带来太多的改进(因为硬件在运行时优化了传输),所以编写一些东西并对其计时可能是唯一可以确定的方法。此外,如果你真的对性能着迷,你可能需要看看SSE或AltiVec或你的处理器拥有的任何矢量化技术,因为这将比你在做矢量数学时可以编写的任何便携式技术都要好。

有没有理由不使用大小?大小\u t在32位系统上是4字节,在64位系统上是8字节,并且可能比使用WORD\u size更便于移植(我认为WORD\u size是特定于gcc的,不是吗?)


我不知道64位系统上有任何128位的值,这里可能是错误的,但在内核或普通用户应用程序中没有遇到这种类型的值。

有什么原因你不想使用现有且经过良好测试的库吗?米奇:对我来说,这只是一个练习,让我温习一下我的C。在x86_64系统上使用GCC,您可以使用
\uuuu int128\t
类型执行128位整数运算。然而,这是不可移植的。几年前,Java也不支持asm来检查位,所以在内部表示为31或63位要比在使用时扩展更有效。GMP对“钉子”有实验性的支持,这似乎是一种类似的方法。皮特,我认为你应该把这个评论作为一个实际的答案(添加到“检测溢出”部分)。问题是我希望在32位机器上使用int32_t存储数字,在64位机器上使用int64_t存储数字。以下是比使用intptr_t类型更好的方法吗?:#if u WORDSIZE==64 typedef int64_t intword#else typedef int32_t intword#endif同样,在32位机器上,我总是可以将int32_t向上转换为int64_t以确保加法等不会溢出,但是在64位机器上,是否有一种128位类型可以向上转换以避免溢出?C99定义了
int\u fast64\u t
int\u fast32\u t
,等等。所以它们可能会有用?由于您的目标是实现一个中等效率的库,我想说,使用上面的一个库,然后根据需要进行优化。我的理解是,int_fastXX_t类型只是“别名”,表示您机器的自然int类型(XX大于机器的本机int宽度时除外)。因此,int_fast8_t在32位机器上为32位,在64位机器上为64位。这些类型是否提供了其他优化,还是仅此而已?@datkin,是:
int\u fast32\u t
实际上可能是
int64\u t
。但它们不提供任何其他优化。我之所以提出这个建议,是因为你在最初的问题中提到了优化。在任何情况下,由于您只是在“尝试”,您应该选择一种类型,然后在以后进行优化。我从中得到的印象是,intptr\t在这方面比size\u t更便于携带:当然,我不想存储指针,我想存储一个占用整个寄存器的整数。@datkin:链接中的问题是关于存储指针的。就你的情况而言,
size\u t
intptr\u t
好,或者使用
[u]int[\u fast]N\u t
类型。我知道这只是一个练习,但可移植性有多重要?如果这不重要,那么也许你不在乎尺寸。此外,我在使用大小定义时遇到问题