|
|
1
6
我有几次请求解释我的评论。
事实上
一个快速而肮脏的问题示例:
在我工作的大多数项目中
一般处理
|
|
|
2
5
使用无符号字符有其优点和缺点。最大的好处是,您不会得到符号扩展或其他有趣的功能,如符号溢出,将产生意想不到的计算结果。无符号字符还与<cctype>宏/函数(如isalpha(ch))兼容(所有这些都需要无符号字符范围内的值)。另一方面,所有I/O函数都需要char*,这要求您在执行I/O时进行强制转换。 至于UTF-8,将其存储在有符号或无符号数组中是可以的,但是必须小心使用那些字符串,因为它们不能保证是有效的UTF-8。C++0x添加UTF-8字符串文字,以避免可能出现的问题,我希望下一个C标准也采用这些。 不过,一般来说,只要确保源代码文件始终是UTF-8编码的,就应该没问题。 |
|
3
4
两件事:
|
|
|
4
2
有符号/无符号只影响算术运算。如果char是无符号的,那么更高的值将是正值。如果签了字,它们将是否定的。但范围还是一样的。 |
|
|
5
1
不是真的,
所以,一个
|
|
|
6
1
使用char*作为字符串没有区别。唯一有符号/无符号的时间会产生影响的是,您是将其解释为一个数字,比如算术,还是将其打印为一个整数。 |
|
|
7
0
UTF-8
不能假定字符存储在一个字节中。UTF-8字符可以是1-4字节宽。所以,a
大多数平台(如PHP、.NET等)通常都会构建字符串(如
|
|
|
8
0
关于你的问题:
对。是我的。下面是我的应用程序中一个简单的可运行的摘录,如果使用普通的签名字符,那么这个摘录就完全错了。 在将所有字符更改为无符号参数后尝试运行它。这样地: int有效( 未签名 字符c); 然后它应该能正常工作。
它所做的是验证字符是否是utf-8中的有效字节。 0xFF和0xFE在utf-8中不是有效字节。 想象一下,如果函数将其验证为有效字节,会出现什么问题? 发生了什么事:
如果将其保存在普通字符(带符号)中,则最左边的位(最有意义的位)将变为负数。但是它是什么负数呢? 它通过翻转位并添加一位来实现这一点。
记住它是负的,所以它变成-2 所以函数中的(-2==0xFE)不是真的。 因此,检查无效字节的函数最终会验证未验证的字节,就好像它们是正常的一样:-o。 在处理utf-8时,我还可以想到另外两个坚持使用unsigned的原因:
|