签名不是正常的char吗?
无论char
是signed
或是依赖于实现unsigned
.
此外,符号位不会"丢失",它仍然可以用于表示信息,并且char
不一定是8位大(在某些平台上可能更大).
这里有一个潜在的问题:
如果一个实现CHAR_BIT == 8
使用符号幅度表示char
(所以char
有符号),那么当UTF-8需要位模式时10000000
,那就是负0.所以如果实现进一步不支持负0,那么给定的UTF-8字符串可能包含无效(陷阱)值char
,这是有问题的.即使它确实支持负零,比特模式10000000
比较等于char
比特模式00000000
(nul终结符)的事实在使用UTF-8数据时也容易引起问题char[]
.
我认为这意味着对于符号级别的C11实现,char
需要是无符号的.通常,无论char
是有符号还是无符号,都取决于实现,但当然如果char
签名导致无法正确实现UTF-8文字,那么实现者只需选择无符号.顺便说一句,这一直是C++的非2补码实现的情况,因为C++允许char
以及unsigned char
用于访问对象表示.C只允许unsigned char
.
在2的补码和1的补码中,UTF-8数据所需的位模式是有效值signed char
,因此实现可以自由地进行char
有符号或无符号,并且仍然能够表示UTF-8字符串char[]
.这是因为所有256位模式都是有效的2的补码值,并且UTF-8恰好不使用该字节11111111
(1s'补充负零).