c - unsigned 在 if 语句比较中变为 signed?

标签 c comparison if-statement unsigned

我在这个网站上搜索了一个答案,发现了很多对无符号/有符号比较的回应,但这个问题是只比较无符号参数,但它仍然很有趣。

以下代码的问题是第一个 if 语句不会发生(“hello”),而第二个(“world”)会发生。我将此解释为在 if-statment 内完成的计算会生成一个负数,但将结果保存到变量中的完全相同的计算不会(即使结果保存到一个带符号的变量)。

使用的编译器是gcc 4.4。

unsigned short u16_varHigh;  
unsigned short u16_varLow;  
unsigned short u16_Res1;  
signed short   s16_Res1;  

u16_varHigh = 0xFFFF;  
u16_varLow = 10;

u16_Res1 = u16_varLow - u16_varHigh; // response is 11 as expected  
s16_Res1 = u16_varLow - u16_varHigh; // response is 11 as expected

// Does not enter  
if( (u16_varLow - u16_varHigh) > (unsigned short)5 )  
{  
 printf( "hello" );  
}

// Does enter  
if( (unsigned short)(u16_varLow - u16_varHigh) > 5 )  
{  
 printf( "world" );  
}

任何人都可以为我解释一下,也许可以提出一个解决方案来修复第一个 if 语句吗?

最佳答案

在表达式中:

if( (u16_varLow - u16_varHigh) > (unsigned short)5 )  

(u16_varLow - u16_varHigh) 将被提升为 int 并评估为 -65525。解决您的问题的方法是转换为无符号类型,就像您在“Does enter”代码中所做的那样。

s16_Res1 = u16_varLow - u16_varHigh; 产生 11 的原因是减法的结果 -65525 不适合 short。

关于c - unsigned 在 if 语句比较中变为 signed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204327/

相关文章:

c - 基数排序通过仅更改计数子例程的一个循环给出错误的答案

java - 数组:计数、比较和增加

javascript - 仅从字符串中提取数字的函数

c - 我写了一个 if/elseif 语句,但它只给出了第一个条件答案,为什么?

c - 'if' 应该测试 '==' 还是 '!='

C 将其他 C 程序作为主 argv 传递

c - 在 C 中处理字符串时出现问题(打印它们)

c - char** 和 char[][] 之间的区别

c# - LINQ 中 DateTime 比较的性能

string - bash 脚本基本字符串比较