真的有必要像某些使用字符编码或二进制缓冲区的库那样使用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
也正确地复制了字符所包含的位.
有什么理由可以支持使用unsigned char
而不是plain char
?
在其他相关问题中,unsigned char
被突出显示,因为它是由C规范保证没有填充的唯一(字节/最小)数据类型.但是,如上面的示例所示,输出似乎不受任何填充的影响.
我已经用VC++Express2010和MinGW编译了上面的代码.尽管VC给出了警告
warning C4309: '=' : truncation of constant value
输出似乎没有反映出这一点.
顺便说一句,这可能是Should a buffer of bytes be signed or unsigned char buffer?的复制品,但我的意图不同.我是在问,为什么一些似乎与char
同样有效的东西应该输入unsigned char
?
Update:引用自N3337,
Section 3.9 Types
2对于任何对象(基类子对象除外)的
鉴于上述事实,以及我最初的例子是在英特尔机器上,char
默认为signed char
,我仍然不确定unsigned char
是否应该优先于char
.
还要别的吗?