C 如何比较已签名和未签名(并避免问题)

C 如何比较已签名和未签名(并避免问题),c,C,最近我听说C.e.g.中的有符号/无符号比较可能很棘手,还有一些其他问题 我的问题是-如果我们必须比较单一类型和无符号类型(例如,包括=,>,>“如果您知道int在该点上肯定不会保留负值,请将其转换为unsigned。”这将如何解决此问题?>>“如果您知道无符号值将小于INT_MAX,请将其转换为INT。”好的,这是有意义的,因为这是一种安全转换,对吗?由于检查了范围,我的意思是,您可以编写:I

最近我听说C.e.g.中的有符号/无符号比较可能很棘手,还有一些其他问题

我的问题是-如果我们必须比较单一类型和无符号类型(例如,包括=,>,<运算符),有什么策略可以避免这种比较产生的问题

或者我们应该确保总是只比较
int
int
以及
unsigned
unsigned


另外,如果能知道什么时候这种比较是危险的,那就太好了。

最好事先确保你的类型匹配。但如果你不能:

如果您知道
int
在该点上肯定不会保留负值,请将其转换为
unsigned

如果您知道
unsigned
值将小于
INT\u MAX
,请将其转换为
INT

如果这两个值都不成立,则将这两个值强制转换为一个足够大的类型,以容纳需要处理的所有可能值。另一种可能性(当没有足够大的类型时)是使用两种比较:首先将
int
与0进行比较,如果它是非负的,则将其转换为
unsigned
并与
unsigned
值进行比较

如果您不强制转换任何内容,则
int
将强制转换为
unsigned
,但如果这是您想要做的,则最好明确说明这一点


int
值为负值时,将
int
无符号
进行比较将无法正常工作。这是因为它将被隐式转换为
unsigned
,这将更改它的值。

首先:您能想出一个例子,比较signed unsigned而不是signed signed或unsigned unsigned有意义吗?也许是因为我的编码“风格”,但目前,我想不起something@deviantfan:事实上,这是有道理的。我也这么想smth。想象一下,如果这个数是负数,那么无符号数肯定会更大。如果是正数-则可以将它们作为无符号值进行比较,对吗?如果可以将值介于负(有符号)最小值和无符号最大值正值之间,则范围中的值比该字节大小的一个整数所能容纳的值多(如2^32或2^64个不同的数字)。单凭这一点就足以避免它。在这种情况下使用更大的变量。@deviantfan:
unsigned char*
vs
char*
。我曾经遇到过一种情况,
strcmp
失败了,我不知道为什么。多年前,我花了一段时间才在这段旧代码中找到它。@staticx:如果你能很容易地找到它,这段代码将非常有趣。@interhay:我的想法是:“另一种可能性(当没有足够大的类型时)要使用两个比较:首先比较int和0,如果它是非负的,则将其转换为unsigned并与unsigned值进行比较。“--在这种情况下,转换非常安全,对吗?无符号的值肯定会比正常的int大。如果int为负,则无符号的值肯定会比正常的int大,对吗?也可以用于处理其他点。>>“如果您知道int在该点上肯定不会保留负值,请将其转换为unsigned。”这将如何解决此问题?>>“如果您知道无符号值将小于INT_MAX,请将其转换为INT。”好的,这是有意义的,因为这是一种安全转换,对吗?由于检查了范围,我的意思是,您可以编写:
I<0 | | |(无符号)I
,而不是
I
。这是因为只有当
i
的值符合
unsigned
“这是因为只有当我的值符合unsigned时才执行强制转换”——这是i的任何值,如果i为正数,对吗?(假设i和u的长度相同)==也有问题吗?;如果你能在回答中总结出一些要点,那就太好了