如果我想要存储的整数值只需要 1 个有符号字节,那么我应该使用 char 还是 short 作为变量类型?

如果程序是为硬件受限的系统设计的,我显然会使用 char 来提高内存效率,但如果程序是为效果可忽略的系统设计的,我是否应该选择可读性更强的 short?或者 char 代表有符号字节是否足以被视为常识?

3

  • 8
    int8_t類型。


    – 

  • 3
    @Ioan“…是否充分考虑了常识,即 char 代表有符号字节?”–>不,这是一个错误的结论。 char 符号位可以是有符号的,也可以是无符号的


    – 

  • 2
    还有int_least8_t,用于表达您的值不依赖于其类型那么小,但代价是有些冗长。


    – 


最佳答案
3

常识是使用有符号字符,因为字符本身可以是有符号的也可以是无符号的,因此可能完全不适合小的有符号整数。

  1. char是整数类型。它占用多少位在 中定义CHAR_BIT

  2. char根据实施和设置,默认情况下可以是签名的,也可以是未签名的。

如果你希望有符号整数长度为 8 位,请按照建议使用int8_t@Andreas Wenzelint_least8_t

4

  • 1
    从技术上讲,该int8_t类型是“可选的”——CPU 可能不支持它。然而,这样的 CPU 相当罕见。


    – 

  • 另一种选择是。与 相比int8_tint_least8_t保证支持 ,而int8_t是可选的。


    – 


  • 请注意,posix要求CHAR_BIT8


    – 

  • char默认情况下,根据实现和设置,可以是有符号的,也可以是无符号的”——我不确定这里的“默认情况下”是什么意思。对于每个实现,char可以是有符号的,也可以是无符号的。charsigned charunsigned char是不同的类型。


    – 


  • signed char或者int_least8_t如果您想要至少 8 位。
  • int8_t如果你想要的是恰好 8 位。

用 C 语言来说,charunsigned char正好signed char是一个字节。但一个字节只是支持的最小类型。从历史上看,这些类型的大小可能小于 8 位,也可能多达 32 位。如今,它们的大小通常为 8 位,但它们(很少)可能更大。CHAR_BIT是这些类型的大小(以位为单位)。

我认为您实际上想要一个八位字节,即 8 位类型。为此,您可以使用int8_tuint8_tstdint.h它们保证大小正好是 8 位。如果环境不支持这些,则不会提供这些类型,并且您会收到编译时错误。

还有int_least8_t和。这些将是可用的最小类型uint_least8_tstdint.h大小至少为 8 位。


值得注意的是,您不应该使用,char因为无论是有符号还是无符号都取决于实现char,并且不同的实现会做出不同的选择。

5

  • 在您的回答中,您写道:"For example, char is usually unsigned in Windows."–您确定吗?根据对,它在 MSVC 上默认签名。这符合我自己的经验。


    – 


  • @Andreas Wenzel,它是在 Linux 中签名的。我以为在 Windows 上是一种方式,在 Linux 上是另一种方式。我想我记错了。调整了答案。


    – 


  • 根据我链接的问题的答案,unsigned char默认使用的主要是 ARM 平台(Apple iOS 除外,可能还有 MacOS)。


    – 


  • 我认为问题不在于操作系统,而在于所使用的编译器。类似 gcc 的编译器往往以char带符号的形式实现,在 Windows 中越来越常见。在嵌入式系统上,编译器通常是无符号的。这里的关键确实是不要将其用于char除字符串/字符之外的任何其他用途。


    – 

  • @Lundin,你说得对,但编译器将与操作系统的 API 保持一致。例如,long无论编译器是什么,64 位 Windows 和 Linux 上的大小都不同。不过,我在原文中提到 Windows 和 Linux 时还是留了一些余地


    –