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

时间:2010-07-19 07:42:57

标签: 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都会保留其值吗?

4 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:1)

我猜你问题的意思是什么是关键。当你说丢失时,你的意思是你正在丢失字节或类似的东西。你不会失去任何东西,因为两者的大小相同,它们只有不同的范围。

signed char和unsigned char不保证是相等的。当大多数人认为unsigned char时,他们会想到0到25​​5.

在大多数实现中(我必须要注意,因为存在差异),signed char和unsigned char是1字节或8位。 signed char通常从-128到+127,而unsigned char从0到+255。

就转换而言,可以通过不同的实现来提出答案。总的来说,我不建议你在两者之间进行转换。对我来说,如果值为负,它应该给你POSITIVE等价物,如果是正数则保持相同。例如在Borland C ++ Builder 5中,给定signed char test = -1并将其转换为unsigned char,结果将为255.或者,如果所有值都为正,则结果不同。

但就比较而言,虽然值可能看起来相同,但它们可能不会被评估为相等。当程序员有时比较有符号和无符号值并想知道为什么数据看起来都相同时,这是一个重大的旅程,但条件不能正常工作。一个好的编译器应该警告你。

我认为在signed和unsigned之间应该有一个隐式转换,这样如果你从一个转换到另一个,编译器将为你处理转换。编译器的实现取决于您是否失去了原始含义。不幸的是,无法保证它始终有效。

最后,从标准中,应该存在signed char或unsigned char到char之间的普通转换。但无论选择采取哪种方式,都是实施定义的

  

3.9.1基本类型[basic.fundamental]

     

1个声明为字符char的对象   应足够大,以存储任何   实施成员的基础   字符集。如果一个角色来自   该集存储在一个字符中   对象,它的整数值   character对象等于该值   单字符文字形式   那个角色。它是   实现 - 定义是否为char   对象可以保持负值。   可以显式声明字符   未签名或签名。简单的char,签名   char和unsigned char是三个   不同的类型。一个char,一个签名的char,   并且一个unsigned char占用同样的东西   存储量和具有相同   对齐要求(basic.types);   也就是说,它们具有相同的对象   表示。对于角色类型,   对象表示的所有位   参与价值   表示。对于无符号字符   类型,所有可能的位模式   值表示代表   数字。这些要求没有   坚持其他类型。 任何   特别的实施,一个简单的   char对象可以采取   与signed char或an相同的值   无符号的字符;哪一个是   实现定义

答案 2 :(得分:0)

AFAIK,此演员表永远不会改变字节,只需更改其表示形式。

答案 3 :(得分:-1)

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