关于C#:uint32_t vs uint_fast32_t vs uint_least32_t

uint32_t vs uint_fast32_t vs uint_least32_t

我在stdint.h中看到了不同类型的整数定义。我将以无符号32位整数为例。

  • uint32_t显然表示32位的无符号整数。那就是我一直使用的那个。

  • uint_fast32_tuint_least32_tuint32_t有什么区别?何时应该使用它们代替uint32_t

  • 现在,我看到了uintX_t,其中X是24、40、48和56。在我的代码中,我必须使用48位和56位整数。例如,我想uint24_t被定义为这样的东西:

    1
    struct uint24_t { unsigned int the_integer : 24; };

    我是对的吗?而且,您是否建议我将uint48_t用于我的48位无符号整数,还是应该使用普通的uint64_t

    感谢您的解释。


    what's the difference with uint32_t

    uint_fast32_t是至少32位的无符号类型,它(以某种通用方式)是最快的此类类型。"快速"意味着给定一个选择,实现者可能会选择体系结构具有算术,加载和存储指令的大小。它不是任何特定基准测试的赢家。

    uint_least32_t是至少32位的最小无符号类型。

    uint32_t是正好32位的类型,没有填充(如果存在)。

    Am I right?

    不。如果uint24_t完全存在,则它是整数类型,而不是struct。如果在此实现中没有24位的无符号整数类型,则它不存在。

    由于要求unsigned long至少为32位,因此uint24_t可能是别名的唯一标准类型是charunsigned charunsigned shortunsigned int。或者,它可以是扩展类型(即,实现提供的整数类型,不是标准中定义的任何整数类型)。

    Will you suggest me to use uint48_t for my 48-bit unsigned integers?

    如果它存在并且是您想要的大小,那么您不妨使用它。但是,它在很多实现中都不存在,因此仅适用于非便携式代码。没关系,只要您必须处理确切的48位整数的原因是特定于平台的。

    确切的16位,32位和64位类型在技术上也是可选的,但是如果实现具有合适的整数类型,则必须存在它们。"合适的"不仅意味着存在没有填充位的精确的N位无符号类型,而且意味着对应的有符号类型没有填充位并且使用2的补码表示。在实践中,这是如此之近,以至于您通过使用它们中的任何一个都很少限制可移植性。为了获得最大的可移植性,您应该优先使用uint_least32_tuint_fast32_t而不是uint32_t。哪一个取决于您是否更关心速度或大小。以我的经验,很少有人会打扰,因为没有32位整数类型的平台已经很怪异,以至于大多数人不在乎他们的代码是否在其上运行。


    uint32_t仅在平台支持正好为32位宽且没有填充的无符号整数类型时存在。

    uint32_least_t始终存在并且是至少32位的无符号整数类型,并且是此类中最小的类型。

    uint32_fast_t也始终存在,并且是至少32位的整数类型,它是平台的"最自然"类型,即操作为其生成最有效代码的类型。

    注意:带符号的版本int32_t也需要2的补号表示。