c++ - "signed char"和 "unsigned char"能否始终相互转换而不丢失数据?

标签 c++ casting

在 C++ 中,我们可以使用 signed charunsigned char,它们的大小相同但值的范围不同。

在下面的代码中:

signed char signedChar = -10;
unsigned char unsignedChar = static_cast<unsigned char>( signedChar );
signedChar = static_cast<signed char>( unsignedChar );

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

最佳答案

不,没有这样的保证。从 signed charunsigned char 的转换是明确定义的,就像 C++(和 C)中的所有有符号到无符号整数转换一样。但是,该转换的结果很容易超出原始签名类型的范围(在您的示例中会发生 -10)。

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

通常,您应该期望实现“定义”它以便恢复原始 signed char 值。但是语言对此没有任何保证。

关于c++ - "signed char"和 "unsigned char"能否始终相互转换而不丢失数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279220/

相关文章:

具有 Raspberry Pi 性能的 C++ 11

c - MISRA:在指向 volatile 对象的指针和整数类型之间转换?

c# - 类型转换基类引用到它的实际类型

ios - [UIApplication sharedApplication].delegate 的转换

c++ - 关于在构造函数中将临时绑定(bind)到引用成员的虚假警告

c++ - 决定在 random_device 和 seed_seq 之间生成多个随机数序列的种子

c++ - std::map 赋值

enums - 将Rust枚举转换为子枚举

c# - 按位运算评估为长

C++ 无法打开源文件