在一些处理字符编码或二进制缓冲区的库中,使用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
的输出还是memcpy
复制char所持有的位,都没有问题,其中f0 a4 ad a2
是Unicode码点 U + 24B62()
的编码(hex)。
什么样的推理可能支持使用unsigned char
而不是普通的char
?
在其他相关问题中,unsigned char
受到关注,因为它是C规范保证不填充的唯一(byte/smallest)数据类型。但正如上面的示例所示,输出似乎不会受到任何填充的影响。
我使用VC++ Express 2010和MinGW来编译上述内容。虽然VC给出了警告
warning C4309: '=' : truncation of constant value
但输出似乎并未反映出这一点。
P.S. 这可能被标记为Should a buffer of bytes be signed or unsigned char buffer?的可能重复项,但我的意图是不同的。我想知道为什么看起来使用char
也可以正常工作,为什么要输入unsigned char
?
更新: 引用N3337中的内容,
Section 3.9 Types
2 对于任何一个平凡可复制类型T的对象(除了基类子对象),无论对象是否持有T类型的有效值,组成对象的底层字节(1.7)都可以被复制到char或unsigned char数组中。如果将char或unsigned char数组的内容复制回对象,则对象随后应保持其原始值。
鉴于上述事实以及我的原始示例是在Intel机器上,其中char
默认为signed char
,我仍然不确定是否应该优先使用unsigned char
而不是char
。
还有其他事项吗?
ifstream
是basic_ifstream<char>
,而不是basic_ifstream<unsigned char>
。我不知道这是否会影响你刚刚做出的修复,但它并不像“在 C++ 中,流数据是无符号字符”这么简单。标准流有所不同。 - Steve Jessop