gpt4 book ai didi

c++ - 为什么 C 编译器不能以直观的方式进行有符号/无符号比较

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:00 26 4
gpt4 key购买 nike

<分区>

“直觉”是指给定的

int a = -1;
unsigned int b = 3;

表达式 (a < b)应该评估为 1。

Stackoverflow 上已经有许多问题询问为什么在这种或那种特定情况下 C 编译器提示有符号/无符号比较。答案归结为整数转换规则等。然而,在比较有符号整数和无符号整数时,为什么编译器必须如此异常愚蠢,似乎没有理由。使用上面的声明,为什么表达式像

(a < b)

不会自动替换为

(a < 0 || (unsigned int)a < b)

如果没有单一的机器指令可以正确地做到这一点?

现在,对于之前的问题有一些评论是“如果你必须混合有符号和无符号整数,那么你的程序就有问题了”。我不会买那个,因为 libc 本身不可能生活在一个有符号或无符号的世界中(例如 sprintf() 函数族返回 int 作为写入的字节数,send() 返回 ssize_t等等)。

我也不认为我可以接受下面评论中表达的观点,即有符号整数到无符号整数的隐式比较转换((d - '0' < 10U)“习语”)赋予 C 一些额外的权力程序员与显式 cast ( ((unsigned int)(d - '0') < 10U) ) 相比。但可以肯定的是,它为搞砸提供了广泛的机会。

是的,我很高兴编译器警告我它不能这样做(不幸的是,只有当我明确要求它时)。问题是——为什么不能呢?通常标准规则背后都有充分的理由,所以我想知道这里是否有任何理由?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com