【问题标题】:Why this program is output Yes, while it should either have thrown error or NO [duplicate]为什么输出该程序是的,而它应该抛出错误或否 [重复]
【发布时间】:2018-01-22 21:23:09
【问题描述】:

这里 a + b 是 -14,它应该小于 'a',因此应该打印 NO 但打印的是 yes。

unsigned int a = 6;
int b = -20;

if((a+b)  > a){
    printf("Yes");
} else {
    printf("NO");
}

return 1;

【问题讨论】:

  • 你为什么要指定 a 是一个无符号整数?你有必要这样做吗?

标签: c types integer type-conversion implicit-conversion


【解决方案1】:

根据 C 标准(6.3.1.8 常用算术转换)

1 许多期望算术类型的操作数的运算符导致 转换和产生结果类型以类似的方式。目的是为了 确定操作数和结果的通用实数类型。为了 指定操作数,每个操作数都被转换,不改变类型 域,对应的实数类型是共同实数的类型 类型。除非另有明确说明,普通实数类型也是 结果对应的真实类型,其类型域是 操作数的类型域(如果它们相同且复杂) 否则。这种模式称为通常的算术转换

...

否则,如果无符号整数类型的操作数有秩 大于或等于另一个操作数的类型的等级,则 带符号整数类型的操作数转换为 无符号整数类型的操作数。

类型 unsigned intint 具有相同的排名。

因此,您示例中的变量 b 的值被解释为无符号值。

如果在printf 的函数调用中为表达式( a + b ) 使用正确的转换说明符%u,那么您可能会得到

#include <stdio.h>

int main(void) 
{
    unsigned int a = 6;
    int b = -20;
    
    printf( "a + b = %u\n", a + b );
    
    return 0;
}


a + b = 4294967282

【讨论】:

  • 很好地理解 unsigned int
【解决方案2】:

你比较有符号和无符号。由于无符号的所有值都不能容纳在有符号中,所以有符号的值被转换为无符号并且远大于6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2014-07-25
    • 2021-12-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多