【问题标题】:Assigned negative value to char in c prints "?" on macOS为 c 中的 char 分配负值打印“?”在 macOS 上
【发布时间】:2020-09-20 11:34:29
【问题描述】:
#include<stdio.h>

int main(){

  signed char c;          //range of signed char is -128 to 127
  char d;                 //this is basically a signed char, if I am not wrong
  unsigned char e;        //range of unsigned char is 0 to 255
  c = -12;
  d = -12;
  e = 255;

  printf("%c\n", c);
  printf("%c\n", d);
  printf("%c\n", e);
  return 0;
}

所有这些字符都打印为“?”。 试图理解为什么?它是垃圾值还是实际上分配给不同值的相同字符?这是极不可能的。

【问题讨论】:

  • "//这基本上是一个签名的字符,如果我没记错的话" 你错了,你不能依赖它。根据编译器和编译器设置,它可以是有符号或无符号的。
  • 如果可能,将输出重定向到a.out &gt; t.bin 之类的文件,然后对文件进行十六进制转储。
  • 您希望在打印后看到什么字符?这些值是否代表您的编码中的任何特殊可打印字符?
  • 如果您打印一些不代表任何可打印字符的值,操作系统可能只会显示一些“垃圾”字符。
  • 尝试for (int i = -128; i &lt; 256; i++) printf("%d &lt;%c&gt;\n", i,i); 了解正在发生的事情。

标签: c xcode macos macos-catalina


【解决方案1】:

当您将charsigned charunsigned char 传递给printf 时,它会提升为int 值(在普通C 实现中,charint 窄) .对于 %c 转换规范,printfint 转换为 unsigned char 并写入结果字符。

当字符不是正在使用的字符集的可打印字符时,显示“?”是一种常见的行为。

char 是有符号还是无符号是实现定义的,尽管它仍然是一个不同的类型,与 signed charunsigned char 分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 2023-04-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2012-11-11
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多