是的,您始终可以毫无问题地从 char 转换为 unsigned char,反之亦然。如果您运行以下代码,并将其与 ASCII 表(参考http://www.asciitable.com/)进行比较,您可以自己查看证明,以及 C/C++ 如何处理转换 - 它们处理完全相同的方式:
#include "stdio.h"
int main(void) {
//converting from char to unsigned char
char c = 0;
printf("%d byte(s)\n", sizeof(char)); // result: 1byte, i.e. 8bits, so there are 2^8=256 values that a char can store.
for (int i=0; i<256; i++){
printf("int value: %d - from: %c\tto: %c\n", c, c, (unsigned char) c);
c++;
}
//converting from unsigned char to char
unsigned char uc = 0;
printf("\n%d byte(s)\n", sizeof(unsigned char));
for (int i=0; i<256; i++){
printf("int value: %d - from: %c\tto: %c\n", uc, uc, (char) uc);
uc++;
}
}
我不会发布输出,因为它有太多行!在输出中可以注意到,在每个部分的前半部分,即从 i=0:127 开始,从 chars 到 unsigned chars 的转换效果很好,反之亦然,没有任何修改或丢失。
但是,从 i=128:255 开始,无法转换 chars 和 unsigned chars,否则您将有不同的输出,因为 unsigned char 保存 [0:256] 中的值,而 char 保存区间 [-128:127] 中的值])。尽管如此,这第二部分的行为是无关紧要的,因为在 C/C++ 中,一般来说,您只能以 chars/unsigned chars 作为 ASCII 字符开头,其只能采用 128 个不同的值和其他 128 个值(对于 chars 为正或负对于无符号字符)从不使用。
如果您从未在不代表字符的 char 中输入值,并且从未在不代表字符的 unsigned char 中输入值,那么一切都会好起来的!
额外:即使您在 C/C++ 的字符串中使用 UTF-8 或其他编码(用于特殊字符),使用这种类型转换的所有内容都可以,例如,使用 UTF-8 编码(参考http:// lwp.interglacial.com/appf_01.htm):
char hearts[] = {0xe2, 0x99, 0xa5, 0x00};
char diamonds[] = {0xe2, 0x99, 0xa6, 0x00};
char clubs[] = {0xe2, 0x99, 0xa3, 0x00};
char spades[] = {0xe2, 0x99, 0xa0, 0x00};
printf("hearts (%s)\ndiamonds (%s)\nclubs (%s)\nspades (%s)\n\n", hearts, diamonds, clubs, spades);
该代码的输出将是:
红心 (♥)
方块 (♦)
梅花 (♣)
黑桃 (♠)
即使您将其每个字符都转换为无符号字符。
所以:
“我总是可以安全地将 unsigned char * 传递给这个函数吗?” 是的!
“是否保证我可以随意在 char 和 unsigned char 之间安全地转换(转换),而不会丢失任何信息?” 是的!
“我可以随意在指向 char 和 unsigned char 的指针之间安全地转换(强制转换),而不会丢失任何信息吗?” 是的!
“C 和 C++ 中的答案是否相同?” 是的!