如果我想要存储的整数值只需要 1 个有符号字节,那么我应该使用 char 还是 short 作为变量类型?
如果程序是为硬件受限的系统设计的,我显然会使用 char 来提高内存效率,但如果程序是为效果可忽略的系统设计的,我是否应该选择可读性更强的 short?或者 char 代表有符号字节是否足以被视为常识?
3
最佳答案
3
常识是使用有符号字符,因为字符本身可以是有符号的也可以是无符号的,因此可能完全不适合小的有符号整数。
|
-
char
是整数类型。它占用多少位在 中定义CHAR_BIT
。 -
char
根据实施和设置,默认情况下可以是签名的,也可以是未签名的。
如果你希望有符号整数长度为 8 位,请按照建议使用int8_t
或@Andreas Wenzel
int_least8_t
4
-
1从技术上讲,该
int8_t
类型是“可选的”——CPU 可能不支持它。然而,这样的 CPU 相当罕见。
– -
另一种选择是。与 相比
int8_t
,int_least8_t
保证支持 ,而int8_t
是可选的。
–
-
请注意,posix要求为
CHAR_BIT
8
– -
“
char
默认情况下,根据实现和设置,可以是有符号的,也可以是无符号的”——我不确定这里的“默认情况下”是什么意思。对于每个实现,char
可以是有符号的,也可以是无符号的。char
、signed char
和unsigned char
是不同的类型。
–
|
signed char
或者int_least8_t
如果您想要至少 8 位。int8_t
如果你想要的是恰好 8 位。
用 C 语言来说,char
和unsigned char
正好signed char
是一个字节。但一个字节只是支持的最小类型。从历史上看,这些类型的大小可能小于 8 位,也可能多达 32 位。如今,它们的大小通常为 8 位,但它们(很少)可能更大。CHAR_BIT
是这些类型的大小(以位为单位)。
我认为您实际上想要一个八位字节,即 8 位类型。为此,您可以使用int8_t
和uint8_t
。stdint.h
它们保证大小正好是 8 位。如果环境不支持这些,则不会提供这些类型,并且您会收到编译时错误。
还有int_least8_t
和。这些将是可用的最小类型uint_least8_t
,stdint.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 时还是留了一些余地
–
|
int8_t
類型。–
char
符号位可以是有符号的,也可以是无符号的。–
int_least8_t
,用于表达您的值不依赖于其类型那么小,但代价是有些冗长。–
♦
|