是否真的有必要unsigned char
像在某些处理字符编码或二进制缓冲区的库中那样使用来保存二进制数据?为了理解我的问题,请查看下面的代码 -
char c[5], d[5];
c[0] = 0xF0;
c[1] = 0xA4;
c[2] = 0xAD;
c[3] = 0xA2;
c[4] = '\0';
printf("%s\n", c);
memcpy(d, c, 5);
printf("%s\n", d);
两个printf's
输出都正确,十六进制
f0 a4 ad a2
的Unicode代码点的编码在哪里。U+24B62 ()
甚至memcpy
还正确地复制了 char 所持有的位。
有什么理由可以提倡使用 ofunsigned char
而不是 a plain char
?
在其他相关问题unsigned char
中突出显示,因为它是 C 规范保证没有填充的唯一(字节/最小)数据类型。但正如上面的示例所示,输出似乎不受任何填充的影响。
我已经使用 VC++ Express 2010 和 MinGW 来编译上述内容。虽然 VC 给出了警告
warning C4309: '=' : truncation of constant value
输出似乎没有反映这一点。
PS 这可能被标记为是否应该有符号的字节缓冲区或无符号字符缓冲区?但我的意图不同。我在问为什么char
应该输入一些似乎可以正常工作的东西unsigned char
?
更新:引用 N3337,
Section 3.9 Types
2 对于普通可复制类型 T 的任何对象(基类子对象除外),无论该对象是否拥有类型 T 的有效值,构成该对象的底层字节(1.7)都可以复制到 char 数组中或无符号字符。如果 char 或 unsigned char 数组的内容被复制回对象,则该对象随后应保持其原始值。
鉴于上述事实以及我最初的示例是在char
默认为Intel 的机器上signed char
,我仍然不相信是否unsigned char
应该首选char
。
还要别的吗?