如何检查普通字符是签名还是未签名?

Ole*_*siy 13 c++ syntax char

显然char,默认情况下plain 可以是signed或unsigned.Stroustrup写道:

它是实现定义的普通char是被认为是签名还是未签名.这开启了一些令人讨厌的惊喜和实现依赖的可能性.

如何检查我的字符是签名还是未签名?我可能想把它们转换成int以后,我不希望它们是负面的.我应该总是unsigned char明确使用吗?

Ben*_*ley 26

从标题 <limits>

std::numeric_limits<char>::is_signed

http://en.cppreference.com/w/cpp/types/numeric_limits/is_signed


Kei*_*son 15

一些替代品:

const bool char_is_signed = (char)-1 < 0;

#include <climits>
const bool char_is_signed = CHAR_MIN < 0;
Run Code Online (Sandbox Code Playgroud)

是的,有些系统确实char使用无符号类型.我遇到的例子:Cray T90,Cray SV1,Cray T3E,SGI MIPS IRIX,IBM PowerPC AIX.并且任何使用EBCDIC的系统都必须使普通char无符号,以便所有基本字符都具有非负值.(并且一些编译器可以选择控制签名char,例如gcc -fsigned-char-funsigned-char.)

但是std::numeric_limits<char>::is_signed,正如本杰明林德利的回答所暗示的那样,可能更清楚地表达了意图.

(另一方面,我建议的方法也可以应用于C.)