是否可以在不丢失数据的情况下将"signed char"和"unsigned char"相互投射?

sha*_*oth 6 c++ casting

在C++中,我们可以signed charunsigned char那些同样大小,但持不同范围的值.

在以下代码中:

signed char signedChar = -10;
unsigned char unsignedChar = static_cast<unsigned char>( signedChar );
signedChar = static_cast<signed char>( unsignedChar );
Run Code Online (Sandbox Code Playgroud)

signed char无论其原始价值是多少,它都会保留其价值?

AnT*_*AnT 10

不,没有这样的保证.从转换signed charunsigned char是良好定义的,如在C++(和C)所有签署到无符号整数转换是.但是,转换的结果很容易变得超出原始签名类型的范围(将在您的示例中出现-10).

-反向转换的结果unsigned charsigned char-在这种情况下是实现定义的,如在C++(和C)中的所有溢流无符号到符号整数转换是.这意味着无法仅从语言规则中预测结果.

通常,您应该期望实现"定义"它以便signed char恢复原始值.但语言并不能保证这一点.

  • @alxx:呃......你的意思是"投入*无符号*格式"?从签名到无符号的转换需要生成"模数"值.这就是语言规范所要求的.它是"单独发生"(如在2的补充机器中)还是因为编译器采取措施来确保它是一个不同的故事.回到签名...是的你"可以"做到这一点,但再一次,语言不能保证结果. (2认同)

Alv*_*par -1

我的第一个猜测是“也许”。您是否尝试过使用各种输入对此进行测试?