/*rpm类型.h这是为Linux下的GCC编译器创建的“新”rpmtypes(Pentium-III或更高版本)和MacOS X。假设“短”是s16,“int”是s32,“long long”是合法的并给出s64.对“长”没有任何假设。如果您所在的系统没有编译器定义的64位类型(与Metrowerks中的PMZ类似)使用旧的“rpm_types.h”。修订历史:2009021x添加#define U8、S8、U16等供AltiVec矢量使用宏。20091111添加f23e7和f52e11类型20091113添加float4和float820130225使用type_s16.h、type_s32.h和type_s64.h;展开128位整数和GCC的文档。BUGS和TTD我需要在这两个32中的rpmlib.pl和mk_compile函数下测试它以及64种模式,以确定假设是否仍然正确。笔记可以使用“show_predefs.h”或命令,如:gcc-dM-E-</dev/null|sort下面是编译器定义的部分列表,可用于指针和long的大小。它们是这样使用的:#if(定义(__foo_)和&定义(_bar_))宽度定义64位_AIX和__64位__64 __hpux和__LP64__32__linux__&__i386__64 __linux__&__ia64__64 __linux__&__x86_64__32 __linux__&__powerpc__64 __linux__&__powerpc64__32 ___linux__和___390__64 __linux__&__s390x__64 ____osf__64正弦和__LP64__64 _温6432_WIN32型对于Sun,您需要测试“Sun”或“__Sun”,如果是定义,包括然后测试“_LP64”。要在Microsoft visual C++(即在_WIN32和_WIN64),您可以使用“__int64”和“unsigned __int64.”。在后者中csae(仅)__int64相当于long。要在Linux(即__Linux__)和MacOS X(即。__APPLE__和__MACH_)可以包括然后使用“int64_t”和“uint64_t“。否则,测试上面列表中的其他组合(例如__hpux&&__LP64__)来确定“long”是否为64位,如果不是,则使用“long long”可获得64位。关于128位整数在GCC扩展文档的早期版本中定义“long long int”如下(取自info节点GNU CC版本2.7.2中的“(gcc.info)Long Long”):双字整数====================GNU C支持长度为`long int“。只需为有符号整数写“long long int”,或`“unsigned long long int”表示无符号整数。生成整数类型为“long-long-int”的常量,将后缀“LL”添加到整数中。要生成“unsigned long long int”类型的整数常量,请将整数的后缀“ULL”。您可以像使用任何其他整数类型一样在算术中使用这些类型。对这些类型进行加法、减法和位布尔运算在所有类型的机器上都是开放代码的。乘法是开放编码的如果机器支持全字到双字的加宽乘法说明。除法和移位仅在以下机器上开放编码提供特殊支持。非开放代码操作使用GNU CC附带的特殊库例程。在函数中使用“long long”类型时可能会有陷阱参数,除非您声明函数原型。如果函数其参数应为“int”类型,而您传递的值为“long”类型long int’,将导致混淆,因为调用方和子例程将不同意参数的字节数。同样,如果函数需要“long long int”,而您需要传递“int”。最好的方法避免此类问题的方法是使用原型。如果您将其与原始C语言中的“long”定义相结合int’(即硬件支持的最宽整数类型寄存器)意味着在未来64位目标上(如DECAlpha 21064)GCC将通过“long long int”提供128位整数。(在这样的机器上,“int”可能是32位的,“short”可能是为16位)。然而,到64位处理器开始相当流行的时候(大约在Athlon 64被广泛部署的时候)很明显更重要的是要有一种标准的方法来获取64位整数,所以GCC改变了路线。上述第一段的后续版本如下与GCC版本2.95中的示例类似:GNU C支持长度小于#:两倍的整数的数据类型int:>。只需为有符号整数或无符号整数编写long long intlong long int表示无符号整数。使整数常量如果类型为long-long-int,则将后缀LL添加到整数中。要制作无符号long long int类型的整数常量,添加后缀ULL到整数。这种重写反映了当前GCC的情况,其中“int”是32位且“long long int”为64位,无论是否编译对于32位或64位(例如分别使用-m32或-m64):“long”或指针的大小仍然存在差异,例如“sizeof(void*)”`根据定义,long始终与指针的大小。)更晚的版本使其更加明确;此文本来自GCC3.0.4版:<#:ISO C99支持至少64位整数的数据类型作为扩展,GCC在C90模式和C++中支持它们。:>只需为有符号整数或无符号long编写long long intlong int表示无符号整数。要使整数常量为键入long long int,将后缀“LL”添加到整数。要制作无符号long long int类型的整型常量,添加后缀`ULL’到整数。后来的GCC版本为__int128添加了一个单独的部分,如下所示显示GCC 4.6.3版文档中的文本:6.8 128位整数作为扩展,支持整数标量类型__int128具有足以容纳128位的整数模式的目标。简单地说为有符号128位整数写入__int128,或为无符号__int128对于无符号128位整数。GCC不支持对于具有long的目标,表示__int128类型的整数常量宽度小于128位的长整数。我还发现GCC实际上实现了__int128_t类型在64位PowerPC和Intel目标上(至少早于GCC4.0.1,这是我在PMG5和MBP上看到的)。这个“__int128_t”并不广泛也没有解释为什么它不是“_int128”。此外,较新版本的GCC具有显式的宽度声明语法这样地:typedef无符号int u64 __attribute__((模式(DI)));它引用了GCC内部的“机器模式”,包括:QMode-“Quarter-Integer”模式表示一个字节,被视为一个整数。HImode-“半整数”模式表示两个字节的整数。SImode-“Single Integer”模式表示四字节整数。DImode-“双整数”模式表示八字节整数。TImode-“四整数”(?)模式表示一个十六字节的整数。OImode-“八位整数”(?)模式表示32字节整数。以下是相关报价:http://www.x86-64.org/pipermail/discuss/2005-August/006412.htmlJan Beulich JBeulich访问novell.com2005年8月18日星期四15:37:17 CEST>>>“H.Peter Anvin”11.08.05 01:50:28 >>>>冈纳写道:>>你好。>>我想将两个64位整数相乘,然后在Athlon64上运行它机器。>>这意味着结果将是128位。>>是否有任何128位整数算术指令可以使用还是我>>必须找到其他方法吗?>> >>C/C++中的任何说明性代码也会有很大帮助。>> >>我认为__int128在当前gcc中没有实现,但在>组装-这只需使用mulq(如果有符号,则使用imulq)完成>说明:gcc一般支持所有人的双机器字操作目标,因此支持128位整数(使用自定义__int128_t和__uint128_t类型,或使用__attribute__((__mode__(__TI__)))适用于所有64位机器。此外,我最近还承诺补丁实际为x86-64提供一些后端支持,因此4.1将希望生成比(与体系结构无关)分裂成机器字数量。旧版本GCC的大多数文档位于gcc.gnu.org/onlinedocs/*/#如果索引_RPMTYPES_H_#定义_RPMTYPES_H_/*“bit”是布尔标志,为了慷慨起见,我们给了它8位带符号范围*/typedef字符位;typedef字符s8;typedef无符号字符u8;#包括“type_s16.h”/*typedef短s16;typedef无符号短u16*/#包括“type_s32.h”/*typedef int s32;typedef无符号整数u32*//*20世纪90年代(Metrowerks项目,尤其是Power MANDELZOOM)I使用C++库“i64_o.C”获取64位整数。PMZ是指我仅有的一个项目仍在使用它。“long long”已经可用自从我切换到Linux之后*/#包括“type_s64.h”/*typedef long long int s64;typedef unsigned long long int u64*/#ifdef RPMTYPES_WANT_128#if(定义(__LP64__)||定义(__x86_64__)#定义RPMTYPES_128_AVAILABLEtypedef __int128_t s128;typedef __uint128_t u128;#其他/*对于没有__int128_t的环境,128位整数由提供运算符正在重载对象/include/int128.c,它需要将您的程序转换为C++。阅读该文件了解更多详细信息。数据类型等效于:typedef结构{s64 hi;u64 lo;}s128;typedef结构{u64 hi;u64 lo;}u128;*/#定义s128 use_int128_dot_c use_inte128_dotc;#定义u128 use_int128_dot_c use_inte128_dot-c;#结尾#结尾typedef浮点f32;typedef双f64;类型定义浮点f23e7;typedef双f52e11;typedef浮点浮点4;typedef双浮点8;/*这些#定义可以以类似的方式使用*类型定义。然而,它们也可以在向量内部使用*声明,如“矢量S16 foo;”。普通typedef类似*如果您声明“vectors s16”,“typedef short s16”就不能这样工作*foo;“你会得到一个错误*/#定义U8无符号字符#定义S8有符号字符#定义U16无符号短#定义S16有符号短#定义U32无符号int#定义S32有符号int#定义U64无符号long long#定义S64 signed long long#定义F23E7浮点#定义F52E11双精度#endif/*_RPMTYPES_H_*/