【问题标题】:producing output of arrow keys产生箭头键的输出
【发布时间】:2025-12-27 11:20:09
【问题描述】:

我们知道箭头键会产生两个输出 22477807275

代码1:-

int main()
{
    int ch,ch1;
    ch=getch();
    ch1=getch();
    printf("%d\n",ch);
    printf("%d",ch1);
}

当你按下up key它会显示

224
72

代码2:-

int main()
{
    char ch,ch1;
    ch=getch();
    ch1=getch();
    printf("%d\n",ch);
    printf("%d",ch1);
}

当您按下up key 时,它会显示

-32
 72

我的问题是,正如您所见,charint 的第二个输出相同,但为什么第一个输出即 224-32int 和 @987654337 不同@。

【问题讨论】:

  • 你知道getch的返回类型是什么吗?
  • @hacks :我认为它只是返回从键盘读取的字符

标签: c char int output arrow-keys


【解决方案1】:

编号 224,当存储在 signed char 中时,溢出。

char 通常被视为signed char 并且可以保存值from -128 to 127。当您尝试存储超出这些限制的数字时,会发生溢出,从而导致数字从另一端绕过。

你可以把它想象成在一个罐子里装满水,然后当你装满整个罐子时把整个罐子倒空,然后继续装满剩下的任何东西。在这种情况下,您将使用224 填充char 变量...所以;

  • 224 先补 127,
  • 那么你就剩下 224 - 127 = 97,
  • 再多一个 (97 - 1 = 96),你现在是 -128,
  • 你最终得到 -128 + 96 = -32

【讨论】:

    【解决方案2】:

    这是因为 char 的范围是 -128 到 127。这意味着您可以指定 0 到 127 的正值和 -1 到 -128 的负值。

    【讨论】:

      【解决方案3】:

      帮助/手册页说 getch 返回 int: not char。

      根据编译器的不同,char 可以默认为有符号字符或无符号字符。有符号字符的范围是 -128..127,无符号字符的范围是 0..255。在这种情况下,它是一个有符号字符。 Microsot 编译器为此提供了编译器开关。

      如果将 224 分配给 unsigned char,您将获得 224。如果将其分配给 unsigned char,您将获得 224-256 = -32。

      【讨论】:

      • 请详细说明一下signed char