【问题标题】:I'm confused with a output . So I'm expecting explaination For my output我对输出感到困惑。所以我期待解释我的输出
【发布时间】:2020-01-16 01:24:05
【问题描述】:
  #include <stdio.h>
    {
        char num = 127;
        num = num + 1;
        printf("%d", num);
      return 0;
     }

输出为:-128

编辑:当我发布这个问题时,我还是个新手。大声笑:)。

【问题讨论】:

  • 你认为char 有多大,它的最小值和最大值是多少?
  • 澄清输出为负128。
  • @SteveSummit 1 字节
  • 在 32 位机器上,您通常可以看到与 int num = 2147483647; num = num + 1; 相同的效果。
  • @AugustinLopez:num = num + 1 不会导致溢出。 num 自动提升为int,然后在int 中进行加法,得到128 没有溢出。然后分配执行到char 的转换。这不是溢出,但根据 C 2018 6.3.1.3,会产生实现定义的结果或信号。这与溢出不同,因为 C 标准根本没有指定溢出时的行为,但是在这段代码中,它指定实现必须定义行为。

标签: c input output


【解决方案1】:

char 在大多数系统上占用 1 个字节(8 位)。您的实现似乎有 char 表示有符号类型,但是在其他实现中它可能是无符号的。有符号类型的最大值为 2^(n-1)-1,其中 n 是位数。所以char的最大值是2^(8-1)-1=2^7-1=128-1=127。最小值实际上是-2^(n-1)。这意味着最小值为 -128。当您添加超过最大值的内容时,它会溢出并循环回最小值。因此,如果您正在做 char 算术,则 127+1=-128。

您从不使用char 进行算术运算。请改用signed charunsigned char。如果您将char 替换为unsigned char,程序将按预期打印128。请注意,溢出仍然可能发生(无符号类型的范围从 0 到 2^n-1,因此如果将 1 加到 255,unsigned char 会溢出,得到 0)。

【讨论】:

  • (a) char 似乎是 OP 的 C 实现中的签名类型。 C 标准允许对其进行签名或未签名。 (b) C 标准没有规定,对于有符号整数,算术换行。在算术中,溢出会导致 C 标准根本没有定义的行为。在转换中,它会导致实现必须定义的行为。 (c) 根据 C 标准的定义,char 始终是一个字节。灵活的是一个字节中的位数,而不是 char 是否是一个字节。
  • @EricPostpischil 这就是您从不使用char 存储数字的原因。它的目的是存储字符(ASCII 值)。我说它是签名类型,因为这就是我在问题中看到的。例如,在我的实现中它是无符号的。
  • A char总是 1 个字节。 可以从一个系统到另一个系统改变的是字节的大小。在现代架构上几乎总是 8。它过去不是那么标准。
  • @giusti 不! char 的签名可以从一个实现更改为另一个。这是 C 标准允许的。
  • 我认为你误读了我。我的意思是sizeof (char) 始终为1。当然,您对签名是正确的。那不是我的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多