C编译器如何处理-10u?

时间:2017-02-28 23:37:48

标签: c

#include<stdio.>

int main() {
    signed x;
    unsigned y;

    x = 10 +- 10u + 10u +- 10;
    y = x;
    if(x==y)
        printf("%d %d",x,y);
    else if(x!=y)
        printf("%u  %u",x,y);
    return 0;
}

我无法理解上述程序的流程。请解释编译器如何将-10u视为默认值。根据我的理解10u是未签名的,但在此程序中它会自动将其转换为-10。

http://www.cquestions.com/2012/02/data-type-questions-in-c.html,问题没有。 3。

2 个答案:

答案 0 :(得分:6)

-10u是&#34;一元减号&#34;运算符应用于10u类型的常量unsigned int。结果是-10类型域中表示的unsigned int的值。根据无符号算术的规则,最终结果将等于UINT_MAX + 1 - 10,并且类型为unsigned int

答案 1 :(得分:2)

  

在这个程序中它自动转换为-10

它不会转换为-10,它会在您执行添加时转换为表现的大正数,如-10。

C标准说:

  

涉及无符号操作数的计算永远不会溢出,因为无法用结果无符号整数类型表示的结果是以比结果类型可以表示的最大值大1的数量为模的

此行为的结果是,当您向10添加- 10u时,结果为“比结果类型可以表示的最大值大一个”,因此它被截断为零。这正是使用签名类型添加+10-10时的行为。

也许这种行为更容易理解小数。假设您有一个可以表示数字0..99的系统,其中100包回零。然后10将保持10,而-10将变为99 + 1-10 = 90。现在当你添加10和90时,你得到100,它被截断为零。