【问题标题】:what is behavior when char is compared with unsigned short in c language?char 与 c 语言中的 unsigned short 进行比较时的行为是什么?
【发布时间】:2020-10-31 19:23:19
【问题描述】:

当我运行以下程序时:

void func(unsigned short maxNum, unsigned short di)
{
    if (di == 0) {
        return;
    }

    char i;

    for (i = di; i <= maxNum; i += di) {
        printf("%u ", i);
    }

    printf("\n");
}

int main(int argc, char **argv)
{
    func(256, 100);
    return 0;
}

这是一个无限循环,但我想知道当 char 与 unsigned short 进行比较时,char 是否会转换为 unsigned short?在这种情况下,char 溢出并且大于 maxNum。我真的不知道如何解释这个程序的结果。

【问题讨论】:

  • 我猜char 没有翻译成unsigned short
  • @Lucas 是的,char 和 unsigned short 都被转换为有符号的 int....令人惊叹的

标签: c char compare unsigned


【解决方案1】:

实现定义的行为未定义的行为CHAR_MAX &lt; 256


让我们整理一下:

... unsigned short maxNum
... unsigned short di
char i;
for (i = di; i <= maxNum; i += di) {
    printf("%u ", i);
}

char 可以是已签名 char未签名 char。让我们假设它是签名的

unsigned short 可能与unsigned 具有相同的范围,当两者都是 16 位时。然而,更常见的是发现 unsigned short 为 16 位,int, unsigned 为 32 位。

还有其他可能,但让我们继续以上两个假设。

如果分配的值超出char 的范围,i = di 可能会很有趣,但 100 始终在 char 范围内,因此 i 是 100。

i &lt;= maxNum 中的每个参数都经过通常的整数提升,因此 已签名 char i 首先变为 int 100,而 16 位 maxNum 变为int 256。当100 &lt; 256 为真时,进入循环体。请注意,i 永远不会期望有一个像 256 这样大的值,因为 CHAR_MAX 小于 256 - 即使在后续循环中也是如此 - 这解释了看到的永远循环。 But wait there's more

对于printf("%u ", i);printf() 需要匹配的unsigned 参数。但是i 作为一个范围较小的类型,然后int 被提升为int,其值与 ... 参数的一部分相同。通常打印不匹配的说明符和类型是未定义的行为,但有一个例外:当值可以表示为有符号和无符号类型时。 100是第一次,一切OK。

在循环结束时,i += di 就像 i = i + di;。加法参数经过通常的整数提升并成为添加到int 100int 100。总和是 200。到目前为止没有什么奇怪的。然而,将 200 分配给 signed char 会隐藏 200,因为它超出了范围。这是实现定义的行为。分配的值可能是 0 或 1 或 2.... 通常,通过添加/减去 256 直到在范围内,该值被环绕(“修改”)。 100 + 100 -256 --> -56。

但是第二个 printf("%u ", i); 尝试打印 -56 并且 未定义的行为


提示:启用所有警告,好的编译器会指出许多这些问题并节省您的时间。

【讨论】:

  • 我只是想知道,是否有充分的理由将值包装到范围内?
  • @Lucas 使用 2 的补码类型,换行与忽略高位相同。所以从 32 位到 8 位,0x12345678 变成 0x78。很容易雇用。
  • 我只是有点困惑。您是在说“使用 2 的补码类型,换行与忽略高位相同”。好的,我同意示例 0x12345678 变为 0x78。但它仍然晦涩难懂。如果char a = 127 然后a++ 产生值-128。即在符号量级演示中127 = 0 1 1 1 1 1 1 1 并将其增加1 = 127 + 1 = 1 0 0 0 0 0 0 0 = -128。在这里,我们不是 2 对 127 的补充或包装值(尽管我们可以假设),我们只是将 1 加到值 127 上,这对于有符号类型产生值 -128。
  • signed-magnitude representation1 0 0 0 0 0 0 0(仅 8 位)中的另一件事应该等于 -0,那么为什么它等于 -128?如果我们增加忽略位(16 位) 的数量,即1111 1111 1000 0000,那么1000 0000 = 128 和其余的1111 1111 代表- 是有意义的。但它在1000 0000 = -128 的 8 位中没有意义。怎么样?
  • 请帮帮我,我的头要爆炸了!
【解决方案2】:

我从http://www.idryman.org/blog/2012/11/21/integer-promotion/ 得到了答案,char 和 unsigned short 都被翻译成 int 可以解释这个程序的过程和结果。

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2021-12-28
    • 2011-07-01
    • 2013-12-21
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多