我很困惑。例如: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
为什么有这种现象?真的吗?
我很困惑。例如: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
的数字类型,C在执行操作之前都会将两个操作数转换为int
。
每当你将任何二进制算术运算符一对数字类型的大小相同,在符号类型不匹配,并不比int
短,C的符号操作数转换为无符号的操作之前。
这些是“integer promotion”规则中的两条。它们不是非常直观的,如果今天从头开始设计C,它们可能不是一个人会做的事情,但它们就是它们的样子,我们被它们困住了。
这是通常的整数转换的结果。
在第一种情况下,两个操作数的排名至少为int
,并且具有相同的等级,所以它们被转换为无符号整数类型。
在第二种情况下,int8_t
是char
(它必须是,如果它存在的话),这样两个操作数都提升到int
。 -1
和0
都可以在int
中表示,所以没有警告。
'short'不能是8位,它需要能够表示至少[-32767,32767]的时间间隔(是的,不是-32768,由于C99奇怪的认为非二进制补码算法仍然存在值得困扰的支持)。如果'char'大于8位,'int8_t'可能是一个特殊的扩展类型。 – zwol 2013-05-02 16:58:43
http://stackoverflow.com/a/697531/195488 – 2013-05-02 17:02:03
如果char大于8位,那么您可能不会有int8_t(这是实现提供的可选类型之一,因为标准编写者希望认为某人将在某处运行的UNIVAC实施C99)。 – 2013-05-02 17:31:48
int8_t和uint8_t是char – 2013-05-02 16:54:31
@ 0A0D那么呢? – 2013-05-02 16:55:07
@ 0A0D int16_t,int32_t,.. – gone 2013-05-02 16:56:17