是否真的有必要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);
Run Code Online (Sandbox Code Playgroud)
两者printf's输出 correctly, where f0 a4 ad a2Unicode代码点的编码U+24B62 ()在十六进制中.
甚至memcpy还正确地复制了char所持有的位.
什么推理可能主张使用unsigned char而不是plain char?
在其他相关问题unsigned char中突出显示,因为它是唯一的(字节/最小)数据类型,保证C规范没有填充.但正如上面的例子所示,输出似乎不受任何填充的影响.
我使用VC++ Express 2010和MinGW来编译上面的内容.虽然VC给出了警告
warning C4309: '=' : truncation of constant value
输出似乎没有反映出来.
PS这可以标记为可能重复的字节缓冲区应该是有符号的还是无符号的char缓冲区?但我的意图是不同的.我在问为什么一些似乎工作正常的东西char应该输入unsigned char?
更新:引用N3337,
Section …
如果ToUpper()不存在,你会怎么写?i18n和L10n的奖励积分
由此产生的好奇心:http://thedailywtf.com/Articles/The-Long-Way-toUpper.aspx
language-agnostic unicode localization internationalization toupper