在以下代码中:
#include "stdio.h"
signed char a= 0x80;
unsigned char b= 0x01;
void main (void)
{
if(b*a>1)
printf("promoted\n");
else if (b*a<1)
printf("why doesnt promotion work?");
while(1);
}
我希望“促销”能够被印刷。但它没有。为什么? 如果我可以将数据类型设置为signed和unsigned int,并且具有负数(例如,0x80000000和b作为正数,0x01),则“提升”将按预期打印。
PLZ帮助我了解问题所在!
答案 0 :(得分:10)
你刚刚被C的混乱类型推广规则所困扰。
在C中,小于int
的整数类型的中间体会自动提升为int
。
所以你有:
0x80 * 0x01 = -128 * 1
0x80
已签名扩展为int
:
0xffffff80 * 0x00000001 = -128 * 1 = -128
因此结果为-128
,因此小于1
。
当您使用类型int
和unsigned int
时,两个操作数都会升级为unsigned int
。 0x80000000 * 0x01 = 0x80000000
作为无符号整数大于1
。
所以这里是正在进行的类型促销的并排比较:
(signed char) * (unsigned char) -> int
(signed int ) * (unsigned int ) -> unsigned int
(signed char)0x80 * (unsigned char)0x01 -> (int) 0xffffff80
(signed int )0x80000000 * (unsigned int )0x01 -> (unsigned int)0x80000000
(int) 0xffffff80 is negative -> prints "why doesnt promotion work?"
(unsigned int)0x80000000 is positive -> prints "promoted"
答案 1 :(得分:2)
printf("promoted\n");
永远不会运行的原因
是因为b*a
总是== -128
,小于1
a b
0x80 * 0x01 = -128 * 1