到底是char a 还是 int a ?

在stackoverflow上问问题的时候有人提醒我(ch=getchar())!=EOF里ch应该定义为int类型,然后看见有人说char的范围在不同系统上可能是-128~127也可能是0~255。这我就不不懂了。。char一直以来都都是有符号的么?

阅读 3.2k
2 个回答

1: char 表示的范围
缺省的char 要么是signed char ,要么是 unsigned char ,到底是哪一种,这取决于编译器。这意味着不同机器上的char 可能拥有不同的范围。所以只有当程序所使用的char值位于有符号和无符号的交集,程序才是可移植的

2:

int ch;   // 最好写 int 
while( (ch = getchar()) != EOF )
       ;

在有符号机器上 程序可能正常运行
在无符号机器上,程序异常,循环将永远不会终止
EOF 为 int 类型,每次 ch 和 EOF 在比较时,都首先将ch 转换为 int类型进行比较

char  ch ;
while( (ch = getchar()) != EOF )

当你输入-1时,ch = 0xff; 将ch 提升为int ch = 0x000000ff;
而 EOF 的值为 0xffffffff, 所以循环不会终止

char
signed char
unsigned char

是三个不同的类型,第一个不保证是否有符号,后面两个保证

getchar由于可能返回EOF,也就是-1,所以他的函数声明是int getchar(),你需要用int接受,手动判断是不是-1,不是的话可以安全转为char类型

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进