【发布时间】: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