【问题标题】:C: performing signed comparison in unsigned variables without castingC:在无符号变量中执行有符号比较而不进行强制转换
【发布时间】:2011-05-03 09:49:30
【问题描述】:

我想要一个具有以下签名的函数:

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b);

如果存储在a 中的位的2 补码视图大于存储在b 中的位的2 补码视图,则它的输出应该是1。否则输出应该是0。例如:

signed_a_greater_than_signed_b(0b10000000,any number) => 0
signed_a_greater_than_signed_b(0b01111111,any number other than 0b01111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000001) => 0
signed_a_greater_than_signed_b(0b00000000,0b11111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000000) => 0

功能是没有任何隐式/显式转换(因为这些转换是 实现定义,因此不可移植)

一个这样的实现是:

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b)
{
    // if 'signed' a is positive then 
    //     return 1 if a is greater than b or b is negative
    // otherwise, if 'signed' a is negative then 
    //     return 1 if a is greater than b and b is negative
    if (a <= 0b01111111) return ((b < a) || (b > 0x01111111));
    else                 return ((b < a) && (b > 0x01111111));
}

您能否建议一个使用算术而不是条件来执行此计算的实现?如果必须,你可以使用一个条件

在比较和 C 中的算术中混合使用 un/signed 变量是灾难的根源。此函数是如何规避问题的示例。

我猜有符号变量比较背后的程序集类似于我想要实现的函数(在不支持有符号比较的架构上)

【问题讨论】:

    标签: c casting comparison unsigned signed


    【解决方案1】:

    假设 2 的补码:

    return (a^signbit) > (b^signbit);
    

    signbit 显然是表示的 MSB。

    【讨论】:

    • 我假设您的意思是(a^a_MSB) &gt; (b^b_MSB),在这种情况下您正在比较ab 的绝对值
    • @random 家伙,我不确定你所说的 a_MSB 是什么意思。我打算切换(而不是清除)符号位。如果你把数字放在一个圆圈上,那只会改变原点,带符号的比较也是如此。顺便说一句,作为 xoring 的替代方法,如果表示的 MSB 是所用类型的 MSB 并且不涉及促销(即适用于 unsigned int,而不是 unsigned char),则可以使用添加。
    【解决方案2】:

    如果必须的话,你可以使用一个条件

    您已经有了一个只使用一个条件的解决方案。 ;)

    由于您希望进行算术运算而不是条件运算,因此我假设目标是速度。并且使用查找表甚至比算术还要快。因为您使用的是 8 位字符,所以查找表并不意味着多余:您甚至不需要 256x256 大小的表。 256 的表大小完全足以存储a 的每个值的限制,指示值b 可能必须导致真(或假)。每个函数调用只需执行一次查表(a -> limit)和一次比较(limit b)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2015-06-03
      • 2018-02-16
      • 2011-07-21
      • 2011-04-25
      相关资源
      最近更新 更多