2013-07-18 21:35:58

getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析。

  1. char是字符型数据,如果以为0~255共256个字符,但如果赋给char负数,会怎样?
  2. 如果将char强制转换为int型,结果又会怎样?

需要清楚一点,在计算机中,不管数据类型是char、int、long、double等,数据都是按照二进制的方式存储的,一般是以补码的形式存储的,这可以通过单步跟踪进行观察验证。char数据也是,比如字符a对应的ASCII码为97,即二进制的0110_0001,那么将97赋给一个char型变量,这个char型变量就是字符a了,操作数对于计算机来说就是对应的二进制数据,计算机可不管你是char型还是int型,这也就是测试1中ch赋值为-128与128时,运行结果完全相同的原因,因为-128与128的8bit表示是一样的,赋给ch之后都是1000_0000。

有了上面的分析,对于第一个问题给char型数据赋值为负数,则会根据溢出规则进行处理,此处不再赘述。

对第二个问题,将char强制转换为int型的规则为:

查出char对应的ASCII码,将该ASCII码进行符号扩展得到的32bit(假设int数据为32bit)数据就是对应的int型数据。

比如ch = 'a' ,a的ASCII码为0110_0001,那么(int) ch = 0000_0000_0000_0000_0000_0000_0110_0001,

若ch的ASCII码的最高位为1,则要扩展为1,比如ch = 129,对应的ASCII码为1000_0001,那么(int) ch = 1111_1111_1111_1111_1111_1111_1000_0001,也就是-127,而ch = -1时,-1转换为char对应的ASCII码为1111_1111,那么(int) ch = 1111_1111_1111_1111_1111_1111_1111_1111,还是-1,所以测试2中ch定义为char时,输入ctrl+z,同样可以结束循环。

下面通过几个测试进行分析。

测试1:

 int main()
{
//int ch; //char ch = -1;
//char ch = -64;
char ch = -; //-128对应的二进制补码表示为1000_0000,也就是无符号数的128 //test -128
cout<<"test -128..."<<endl;
cout<<(int)ch<<endl;
cout<<ch<<endl;
cout<<char( (int)ch + )<<endl; if (ch == -)
{
cout<<"ch == -128"<<endl;
} //test -128
ch = ;
cout<<"test 128..."<<endl;
cout<<(int)ch<<endl;
cout<<ch<<endl;
cout<<char( (int)ch + )<<endl; if (ch == -)
{
cout<<"ch == -128"<<endl;
}
}

运行输出:

test -...
-


ch == -
test ...
-


ch == -
请按任意键继续. . .

€为128对应的字符,将ch赋值为其他的负数也可得到对应的结果,就是会把ch当做对应的无符号数处理。

但是若输出(int)ch,为ch的二进制表示对应的 int型数据,比如说-128,其二进制补码为1000_000,强制转换为int型时,会进行符号扩展,对应的int数据为32位的1111_1111_1111_1111_1111_1111_1000_0000,也就是-128.对于其他的负数也是如此,对于正数,则高位是0扩展,所以还是原来的正数。

测试2:

 #include <stdio.h>

 int main()
{
//int ch; char ch; while ( ( ch = getchar() ) != EOF )
{
putchar(ch);
}
}

编译器应该是将与EOF比较的数据都强制转换为int型,验证如下:

测试3:

 char ch = -; 

 if (ch == -)
{
cout<<"ch == -128"<<endl;
}

则会输出

ch == -128,

这验证了上面的说法,就是编译器将ch强制转换为int类型了.

最新文章

  1. Junit测试框架 Tips
  2. System Error Codes
  3. 使用phar上线你的代码包
  4. 更好的逐帧动画函数 — requestAnimationFrame 简介
  5. 学习 Linux,101: 使用基本 SQL 命令
  6. html第一阶段总结
  7. Linux/UNIX脚本中 $0,$1,$2的含义
  8. QQ登入(2)获取用户信息
  9. 转载sublime text3中package Control
  10. STL——heap的4大操作
  11. Android学习总结——系统提示对话框(AlertDialog)
  12. ,gitignore 中规则不起作用的原因
  13. css复合属性的写法
  14. SpringMVC结合ajaxfileupload文件无刷新上传
  15. Hi Java!!!---来自十八岁的程序员随笔
  16. SpringBoot学习之启动探究
  17. Docker配置镜像加速
  18. Linux的基础命令, django的安装与使用
  19. http与中文编码传输
  20. Momenta电话面试笔记

热门文章

  1. Docker容器里时间与宿主机不同步
  2. 修改SSH端口为21
  3. window Jconsole链接到CenOS 监控Tomcat
  4. C# and Redis,安装作为服务
  5. [Linux]学习笔记(3)-uname的用法
  6. C# 学习之旅(2)--- 意外的收获
  7. 自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)
  8. 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
  9. centos startx 进入桌面后使用中文输入法
  10. 提升网站性能之设置gzip