【发布时间】:2015-03-26 02:30:12
【问题描述】:
根据标准,char 是否签名是实现定义的。这给我带来了一些麻烦。以下是一些例子:
1) 测试最高有效位。如果char 已签名,我可以简单地将值与0 进行比较。如果未签名,我会将值与128 进行比较。这两种简单的方法都不是通用的,并且适用于这两种情况。为了写出可移植的代码,看来我得直接对位进行操作,不整洁。
2) 赋值。有时,我需要将位模式写入char 值。如果char 是无符号的,这可以使用十六进制表示法轻松完成,例如char c = 0xff。但是这种方法不适用于char 签名时。以char c = 0xff 为例。 0xff 超出了签名 char 可以容纳的最大值。在这种情况下,标准规定 c 的结果值是实现定义的。
那么,有人对这两个问题有好的想法吗?关于第二个,我想知道char c = '\xff' 是否适用于签名和未签名的char。
注意:有时需要将显式位模式写入字符。请参阅http://en.cppreference.com/w/cpp/string/multibyte/mbsrtowcs 中的示例。
【问题讨论】:
-
如果您关心位模式,也许您应该始终使用
unsigned char。 -
我只使用 char 作为字符,或者因为我必须(流等)如果我想要一些数字,而这些数字恰好是一个字节大小,我总是使用显式签名字符。
-
有时,需要的是一个字符串。但是,应明确指定字符的值。请参阅en.cppreference.com/w/cpp/string/multibyte/mbsrtowcs 中的示例。
-
测试 MSB:
(x | 0x7F) != 0x7F -
我真的不明白你测试 MSB 的理由。无符号和有符号的 MSB 位相同。
标签: c++ char language-lawyer signedness