gpt4 book ai didi

c - ASCII 和 printf

转载 作者:行者123 更新时间:2023-12-02 07:50:54 25 4
gpt4 key购买 nike

我有一个关于 C 中的 int 和 chars 的小(又大又蠢?)问题。我从我的研究中记得“chars 是小整数,反之亦然”,这对我来说没问题。如果我需要使用小数字,最好的方法是使用 char 类型。

但是在这样的代码中:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int i= atoi(argv[1]);
printf("%d -> %c\n",i,i);
return 0;
}

我可以使用我想要的每个数字作为参数。因此,对于 0-127,我获得了预期的结果(标准 ASCII 表),但即使使用更大或负数,它似乎也能工作......

举个例子:

-181 -> K
-182 -> J
300 -> ,
301 -> -

为什么?在我看来,它在 ascii 表周围循环,但我不明白如何。

最佳答案

当你传递一个对应于“%c”转换说明符的int时,int被转换为unsigned char然后写入。

当您传递的值超出无符号范围(0 到 UCHAR_MAX)时,它们将被转换为不同的值。您正在使用的系统可能有 UCHAR_MAX == 255。

将 int 转换为 unsigned char 时:

  • 如果值大于UCHAR_MAX, (UCHAR_MAX+1) 是从值中减去多少多次将其带入范围从 0 到 UCHAR_MAX。
  • 同样,如果值小于零,(UCHAR_MAX+1)被多次添加到值中根据需要将其纳入范围0 到 UCHAR_MAX。

因此:

(unsigned char)-181 == (-181 + (255+1)) == 75 == 'K'
(unsigned char)-182 == (-182 + (255+1)) == 74 == 'J'
(unsigned char)300 == (300 - (255+1)) == 44 == ','
(unsigned char)301 == (301 - (255+1)) == 45 == '-'

关于c - ASCII 和 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3880957/

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