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种组合或范围。