变量 > -1 在 C 中如何准确计算?

问题描述 投票:0回答:2
#include <stdio.h>
#include <stdint.h>
int main()
{
    uint16_t peter = 8;
    uint32_t peter2 = 8;
    if(peter > -1)
    {
        printf("Peter true\n"); //expected
    } 
    if (peter2 > -1)
    {
        printf("Peter 2 true\n"); //wtf, why not
    }

    return 0;
}

为什么第一个语句进入子句而第二个语句没有进入子句(在 32 位架构上)?

c casting twos-complement
2个回答
0
投票

这一切都与隐式转换有关。

对于

peter > -1
peter
的值被 提升
int
。但对于
peter2 > -1
来说,它是
-1
的值,它被 converted
uint32_t

补码系统中,

-1
全为1,因此会转换为值
2147483647
,该值比
8
的值
peter2
大很多,使条件为假。


0
投票

peter > -1
peter2 > -1
之间差异的解释是“整数提升”以及“通常的算术转换”的概念。

“整数提升”意味着任何比

t
窄的整数类型
int
都会“提升”为
int
(如果
int
可以包含
t
的所有值)或
unsigned int
,否则。在您的示例和编译器中,升级应用于
peter

然后,通常的算术转换决定当算术二进制运算(此处为

>
)应用于不同类型的操作数时会发生什么。在相同宽度的无符号和有符号整数类型之间,这些规则规定有符号操作数在运算发生之前会转换为无符号。

© www.soinside.com 2019 - 2024. All rights reserved.