我有两个变量:
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 */
你有什么想法我会收到警告吗? 这与整数推广有什么关系吗?
答案 0 :(得分:5)
在此表达式a-b
中,将应用整数提升,这意味着a
和b
可能会被提升为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。
这就是你收到警告的原因