当x,y是字符,并且ux =(unsigned)x,uy =(unsigned)y时,ux-uy =-(y-x)在C中总是正确吗?

问题描述 投票:0回答:1

我在C中有以下代码:

char x, y; // Some random values
unsigned ux = (unsigned)x;
unsigned uy = (unsigned)y;

并且我需要确定表达式ux - uy == -(y - x)是否始终为真,并证明或给出反例。

我不知道它是真的还是不是,因为它们是不同类型的整数,具有不同的大小,其中两个是单数形式,另外两个是无符号的。

c char integer unsigned-integer
1个回答
1
投票

[不,在很多情况下ux - uy == -(y - x)不正确。

  • [char具有实现定义的签名,因此没有可移植的方式来判断x和y包含正值还是负值。

  • x和y将使整数升为int,无论它们的符号如何,可能会扩展符号。

  • ==的操作数将根据“常规算术转换”得到平衡,这意味着最终您将隐式地将正确的操作数转换为无符号类型,而不管其原始值是多少。

    理论上,这是通过实现定义的方式完成的,但实际上,它将在所有现实世界2的补码系统上均相同。

总结:由于实现定义的行为和隐式提升,此代码很难可靠/可移植地工作。在某些输入的情况下,可能还会发生一些下溢/上溢。

请参阅这些帖子以获取详细信息:Is char signed or unsigned by default?Implicit type promotion rules

避免此类问题的解决方案是,对所选择的类型要更加小心。避免对小整数类型进行算术运算。注意可变范围。了解各种隐式类型提升规则,以及它们如何引起签名更改等问题。


0
投票

[不,在很多情况下ux - uy == -(y - x)不正确。

  • [char具有实现定义的签名,因此没有可移植的方式来判断x和y包含正值还是负值。

  • x和y将使整数升为int,无论它们的符号如何,可能会扩展符号。

  • ==的操作数将根据“常规算术转换”得到平衡,这意味着最终您将隐式地将正确的操作数转换为无符号类型,而不管其原始值是多少。

    理论上,这是通过实现定义的方式完成的,但实际上,它将在所有现实世界2的补码系统上均相同。

请参阅这些帖子以获取详细信息:Is char signed or unsigned by default?Implicit type promotion rules

© www.soinside.com 2019 - 2024. All rights reserved.