博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
阅读量:6868 次
发布时间:2019-06-26

本文共 1819 字,大约阅读时间需要 6 分钟。

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:

1 int main() 2 { 3     //int ch; 4  5     //char ch = -1; 6     //char ch = -64; 7     char ch = -128;    //-128对应的二进制补码表示为1000_0000,也就是无符号数的128 8      9     //test -12810     cout<<"test -128..."<

 

运行输出:

test -128...-128€€ch == -128test 128...-128€€ch == -128请按任意键继续. . .

 

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

 

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

测试2:

 

1 #include 
2 3 int main() 4 { 5 //int ch; 6 7 char ch; 8 9 while ( ( ch = getchar() ) != EOF )10 {11 putchar(ch);12 }13 }

 

 

 

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

 

测试3:

1 char ch = -128; 2 3 if (ch == -128)4  {5   cout<<"ch == -128"<

则会输出

ch == -128,

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

 

 

转载于:https://www.cnblogs.com/youngforever/p/3199564.html

你可能感兴趣的文章
用Python实现的数据结构与算法:基本搜索
查看>>
一位企业高管带来的感言关于——Polylink IPBX
查看>>
取三个数字最大值
查看>>
thinkphp-query
查看>>
SQL-53 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees...
查看>>
EF6 秘籍 2th:Entity Framework 入门(一)EF诞生的背景
查看>>
GCC 参数详解
查看>>
MongoDB日志切换(Rotate Log Files)指南
查看>>
Linux磁盘分区实战案例
查看>>
squid 3.2 的高级应用-用户认证
查看>>
01_Linux学习
查看>>
修改win 7用户配置文件临时为本地!
查看>>
我的友情链接
查看>>
Apache静态缓存配置
查看>>
牛刀小试之 ---文本处理工具之 grep egrep用法
查看>>
我的友情链接
查看>>
杭电 hdu 2017
查看>>
HashMap与ConcurrentHashMap的区别
查看>>
深入理解Android消息处理系统——Looper、Handler、Thread
查看>>
我的友情链接
查看>>