如果我的目标是可移植性,我应该对具有负值的字符使用带符号的字符吗?

问题描述

char 数据类型不能保证被签名,这意味着在某些实现中它是 signed,而在其他实现中它是 unsigned。那么为什么人们总是忽略 signed 限定符?

char c = 'C'; // can be signed or unsigned
signed char sc = 'D'; // explicitly signed
unsigned char uc = 'e'; // explicitly unsigned
  • 为了可移植性,如果我希望字符保持负值,我是否应该总是用 char 限定 signed

  • 正如我所了解的其他类型,如 intlongshort 总是 signed,除非用 unsigned 明确限定。>

解决方法

类型 char 主要用于存储字符(或者,在 Unicode 时代,部分字符代码)。从这个意义上说,你不应该关心它是否有符号,只要它能够表示字符即可。

当您需要 char 大小的整数时,您应该使用 signed charunsigned char 或它们的典型别名之一(例如 int8_tuint8_t)。这将确保签名并区分类型和字符。