【问题标题】:Please tell me why the c code behaves this way in detail? [duplicate]请告诉我为什么 c 代码的行为如此详细? [复制]
【发布时间】:2019-02-16 15:09:45
【问题描述】:

这是我的代码:

#include<stdio.h>

void main()
{
    unsigned x = 1;
    signed char y = -1;

    if(x>y) printf("x>y");
    else printf("x<=y");

}

在 gcc 上编译时代码的输出是"x&lt;=y"

请任何人解释一下。

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    x&gt;y 中,我们有一个unsigned 和一个signed char。 C 的规则是通过将signed char 转换为unsigned 值来匹配类型,然后进行比较。

    -1 转换为unsigned 时,结果当然不可能是-1,因为unsigned 不能表示负值。 C 的规则说将负值转换为unsigned 是通过将UINT_MAX+1 添加到该值来执行的(根据需要多次添加非负值)。例如,如果UINT_MAX 是 65535,则添加 65536。所以将 -1 转换为 unsigned 的结果是 -1 + 65536 = 65535。

    因此,比较变为1&gt;65535,这是错误的。 (UINT_MAX也可以更大,比如4,294,967,295,这种情况下比较变成1&gt;4294967295,也是假的。)

    【讨论】:

    • 我要补充一点,您应该明确说明无符号的类型(无符号字符、无符号整数、无符号短、无符号长)。此外,您实际上应该只在相同类型之间进行算术运算,或者如果这不切实际,则强制转换以使转换显式:例如,average= (double)x/(double)y;
    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2014-05-29
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多