2013-05-02 73 views
3

我很困惑。例如:intN_t和uintN_t之间的比较

int x=-1; 
unsigned y=0; 
(x<y) ----> false 

int8_t x=-1; 
unint8_t y=0; 
(x<y) ----> true 

此外,编译器会在第一次比较时引发警告,但不会引发第二次比较。看来,对于

  • (INT VS无符号) - 诠释为无符号
  • (intN_t VS uintN_t) - uintN_t升为intN_t

为什么有这种现象?真的吗?

+0

int8_t和uint8_t是char – 2013-05-02 16:54:31

+0

@ 0A0D那么呢? – 2013-05-02 16:55:07

+0

@ 0A0D int16_t,int32_t,.. – gone 2013-05-02 16:56:17

回答

3

无论何时将任何二进制算术运算符(包括比较)应用于一对短于int的数字类型,C在执行操作之前都会将两个操作数转换为int

每当你将任何二进制算术运算符一对数字类型的大小相同,在符号类型不匹配,并int短,C的符号操作数转换为无符号的操作之前。

这些是“integer promotion”规则中的两条。它们不是非常直观的,如果今天从头开始设计C,它们可能不是一个人会做的事情,但它们就是它们的样子,我们被它们困住了。

2

这是通常的整数转换的结果。

在第一种情况下,两个操作数的排名至少为int,并且具有相同的等级,所以它们被转换为无符号整数类型。

在第二种情况下,int8_tchar(它必须是,如果它存在的话),这样两个操作数都提升到int-10都可以在int中表示,所以没有警告。

+0

'short'不能是8位,它需要能够表示至少[-32767,32767]的时间间隔(是的,不是-32768,由于C99奇怪的认为非二进制补码算法仍然存在值得困扰的支持)。如果'char'大于8位,'int8_t'可能是一个特殊的扩展类型。 – zwol 2013-05-02 16:58:43

+0

http://stackoverflow.com/a/697531/195488 – 2013-05-02 17:02:03

+0

如果char大于8位,那么您可能不会有int8_t(这是实现提供的可选类型之一,因为标准编写者希望认为某人将在某处运行的UNIVAC实施C99)。 – 2013-05-02 17:31:48