unsigned在if语句比较中签名?

Wil*_*mer 8 c comparison unsigned if-statement

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

以下代码的问题在于第一个if-statment不会发生("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" );  
}
Run Code Online (Sandbox Code Playgroud)

任何人if都可以为我解释这个问题,或许可以提出一个解决方案来解决问题,以便第一个语句也能正常工作吗?

And*_*nck 4

表达式中:

if( (u16_varLow - u16_varHigh) > (unsigned short)5 )  
Run Code Online (Sandbox Code Playgroud)

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

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