Tag: stdint

如果有或没有x32 ABI,如何为x86_64定义 int_fastN_t类型?

除其他外, x32 ABI为x86_64体系结构生成的代码指定了32位指针。 它结合了x86_64架构(包括64位CPU寄存器)的优点和减少的32位指针开销。 头定义了int_fast8_t , int_fast16_t , int_fast32_t和int_fast64_t (以及相应的无符号类型uint_fast8_t等),每个都是: 一种整数类型,通常在具有至少指定宽度的所有整数类型中运行最快 用脚注: 指定类型不能保证最快用于所有目的; 如果实现没有明确的理由选择一种类型而不是另一种类型,它将简单地选择一些满足符号和宽度要求的整数类型。 (引自N1570 C11草案 。) 问题是,无论是否有x32 ABI,如何为x86_64架构定义[u]int_fast16_t和[u]int_fast32_t类型? 是否有指定这些类型的x32文档? 它们是否应与32位x86定义(均为32位)兼容,或者,由于x32可以访问64位CPU寄存器,它们是否应该具有相同的大小,有或没有x32 ABI? (请注意,无论x32 ABI是否正在使用,x86_64都有64位寄存器。) 这是一个测试程序(取决于特定于gcc的__x86_64__宏): #include #include #include int main(void) { #if defined __x86_64__ && SIZE_MAX == 0xFFFFFFFF puts(“This is x86_64 with the x32 ABI”); #elif defined __x86_64__ && SIZE_MAX > 0xFFFFFFFF puts(“This is x86_64 […]

C类型之间的区别int32_t int_least32_t等

我曾经读过int32_t是32位长,int_least32_t只有至少32位,但是我的stdint.h中有两个相同的typedef: typedef int int_least32_t; 和 typedef int int32_t; 那么区别在哪里? 他们完全一样……

C:gcc中的uint16_t减法行为

我试图减去两个无符号整数并将结果与​​有符号整数(或文字)进行比较。 使用unsigned int类型时,行为符合预期。 当使用uint16_t (来自stdint.h )类型时,行为不是我所期望的。 使用gcc 4.5进行比较。 给出以下代码: unsigned int a; unsigned int b; a = 5; b = 20; printf(“%u\n”, (ab) < 10); 输出为0,这是我的预期。 a和b都是无符号的,并且b大于a,因此结果是一个大的无符号数,大于10.现在如果我改变a和b来输入uint16_t: uint16_t a; uint16_t b; a = 5; b = 20; printf(“%u\n”, (ab) < 10); 输出为1.这是为什么? 两个uint16_t类型之间的减法结果是存储在gcc中的int中吗? 如果我将10更改为10U则输出再次为0,这似乎支持这一点(如果减法结果存储为int并且与无符号int进行比较,则减法结果将转换为unsigned int)。

常见体系结构的最快整数类型

stdint.h头文件缺少int_fastest_t和uint_fastest_t以与{,u}int_fastX_t类型对应。 对于整数类型的宽度无关紧要的情况,如何选择允许处理最大位数且性能损失最小的整数类型? 例如,如果使用朴素方法在缓冲区中搜索第一个设置位,则可以考虑这样的循环: // return the bit offset of the first 1 bit size_t find_first_bit_set(void const *const buf) { uint_fastest_t const *p = buf; // use the fastest type for comparison to zero for (; *p == 0; ++p); // inc p while no bits are set // return offset of first bit set return […]

在C中定义16位整数

我需要在C中声明一个大小为16位的整数。 我知道short和int size是依赖于机器的。 我试图使用”stdint.h”,但似乎他们只是这样做 typedef short int16_t 所以我的问题是: 我错过了什么,短型保证16位长度? 如果不是,是否有替代方案可以保证呢?