签名和未签名警告之间的比较

时间:2012-03-21 08:47:09

标签: c

我有两个变量:

unsigned short a,b;

/* When I compare them with a magic number like this */ 

if (a > 8U) /* all fine*/

/* But when I make the following comparison: */ 

if ((a-b) > 8U) /* warning: comparison between signed and unsigned*/

/* And when I make the following comparison: */ 

if ((a-b) > ((unsigned char)8U)) /* all fine again */

你有什么想法我会收到警告吗? 这与整数推广有什么关系吗?

2 个答案:

答案 0 :(得分:5)

在此表达式a-b中,将应用整数提升,这意味着ab可能会被提升为int,并且表达式的结果也将是int这就是为什么在与8U类型unsigned int进行比较时收到警告的原因。

如果unsinged int无法保存int的{​​{1}}的所有值,只有在int unsigned short的{​​{1}}时才会进行促销}}与int的大小相同。

short进行比较时,(unsigned char)8U也会提升为unsigned char,这就是为什么在这种情况下不会发出警告的原因。

答案 1 :(得分:0)

(a-b)不保证它是无符号的,因为b可能大于a。

这就是你收到警告的原因