C++ 如果我以可移植性为目标,是否应该对具有负值的字符使用有符号字符?

C++ 如果我以可移植性为目标,是否应该对具有负值的字符使用有符号字符?,c++,char,unsigned-char,C++,Char,Unsigned Char,char数据类型不保证是有符号的,这意味着在某些实现中它是有符号的,而在另一些实现中它是无符号的。那么为什么人们总是忽略带符号的限定符呢 char c = 'C'; // can be signed or unsigned signed char sc = 'D'; // explicitly signed unsigned char uc = 'e'; // explicitly unsigned 为了便于携带,如果我想让字符保持负值,我是否应该始终使用带符号的char限定字符 如我所知

char
数据类型不保证是有符号的,这意味着在某些实现中它是
有符号的
,而在另一些实现中它是
无符号的
。那么为什么人们总是忽略带符号的限定符呢

char c = 'C'; // can be signed or unsigned
signed char sc = 'D'; // explicitly signed
unsigned char uc = 'e'; // explicitly unsigned
  • 为了便于携带,如果我想让字符保持负值,我是否应该始终使用带符号的
    char
    限定字符

  • 如我所知,其他类型,如
    int
    long
    short
    总是
    有符号的
    ,除非明确限定为
    无符号的


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


当需要
char
大小的整数时,应使用
signed char
unsigned char
或其典型别名之一(例如
int8_t
uint8_t
)。这将确保签名并区分类型与字符。

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


当需要
char
大小的整数时,应使用
signed char
unsigned char
或其典型别名之一(例如
int8_t
uint8_t
)。这将确保签名并将类型与字符区分开来。

字符的签名应该无关紧要,除非您滥用该类型。如果需要1字节整数,请使用
int8\u t
uint8\u t
。不要使用纯字符进行计算。你能给我们一个实际的例子,而不仅仅是说“如果我想让字符保持负值”吗?你为什么要这样做呢?
char
的符号性应该无关紧要,除非你滥用了该类型。如果你需要一个1字节的整数,请使用
int8\u t
uint8\u t
。不要使用纯字符进行计算。你能给我们一个实际的例子,而不仅仅是说“如果我想让字符保持负值”吗?你到底为什么要这样做?或者C++20中曾经流行的字符转换函数@Maestro,这将导致一个截断的值(参见我之前评论中的链接)。在C++20之前,结果是实现定义的。“当需要
char
大小的整数时,应该使用
signed char
unsigned char
”-嗯,不,当需要整数时,根本不应该使用
char
。“或者他们的一个典型别名(例如,
int8\u t
uint8\u t
)”-是的,改为这样做。@Maestro:在进行数学计算时使用
int
无符号int
)。这些类型通常是处理器寄存器的大小(编译器通常为此进行优化)。唯一需要使用
int8_t
uint8_t
的时间是当您需要或限制为8位数量时(如嵌入式系统和可能的加密)。不使用8位值进行数学运算的问题之一是,处理器针对较大的字大小(如32或64位)进行了优化,并且8位值非常难以确定,从C++20开始,只有256个组合或范围。或者曾经流行的字符转换函数@Maestro,这将导致一个截断值(参见我之前评论中的链接)。在C++20之前,结果是实现定义的。“当需要
char
大小的整数时,应该使用
signed char
unsigned char
”-嗯,不,当需要整数时,根本不应该使用
char
。“或者他们的一个典型别名(例如,
int8\u t
uint8\u t
)”-是的,改为这样做。@Maestro:在进行数学计算时使用
int
无符号int
)。这些类型通常是处理器寄存器的大小(编译器通常为此进行优化)。唯一需要使用
int8_t
uint8_t
的时间是当您需要或限制为8位数量时(如嵌入式系统和可能的加密)。不使用8位值进行数学运算的问题之一是,处理器针对较大的字大小(如32或64位)进行了优化,并且8位值非常难以确定,只有256种组合或范围。