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 -128
10     cout<<"test -128..."<<endl;
11     cout<<(int)ch<<endl;
12     cout<<ch<<endl;
13     cout<<char( (int)ch + 256)<<endl;
14
15     if (ch == -128)
16     {
17         cout<<"ch == -128"<<endl;
18     }
19
20     //test -128
21     ch = 128;
22     cout<<"test 128..."<<endl;
23     cout<<(int)ch<<endl;
24     cout<<ch<<endl;
25     cout<<char( (int)ch + 256)<<endl;
26
27     if (ch == -128)
28     {
29         cout<<"ch == -128"<<endl;
30     }
31 }

运行输出:

test -128...
-128
€
€
ch == -128
test 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 <stdio.h>
 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"<<endl;
6  }

则会输出

ch == -128,

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

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

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

  1. C/C++ 引用作为函数的返回值

    语法:类型 &函数名(形参列表){ 函数体 } 特别注意: 1.引用作为函数的返回值时,必须在定义函数时在函数名前将& 2.用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 ...

  2. scanf函数的返回值问题

    1.scanf()函数有返回值且为int型. 2.scanf()函数返回的值为:正确按指定格式输入变量的个数:也即能正确接收到值的变量个数. scanf("%d%d", & ...

  3. C++知识点8——函数的返回值

    函数的返回值不能是数组或函数,但是可以是是数组和函数的指针或引用 函数返回一个值的过程和初始化完全一致,先创建一个临时变量,用返回值初始化该临时变量,然后用该临时变量去初始化另一个变量或者给另一个变量 ...

  4. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?

    1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...

  5. 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...

  6. 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    文章目录 一.将 两头堵模型 抽象成业务模块函数 二.完整代码示例 一.将 两头堵模型 抽象成业务模块函数 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 , 一般使用 ...

  7. c语言recv函数返回值,谈谈recv()函数的返回值

    网上某论坛有这样一个问题:当recv()函数的返回值为0时,能不能在接收端不关闭套接字,以便这条建立好的C/S通信下次可以直接使用? 我对这个问题的回答是:不能. 原因是:此时即使接收端不关闭套接字, ...

  8. system函数的返回值和执行脚本的返回值

    1.先统一两个说法: (1)system返回值:指调用system函数后的返回值,比如上例中status为system返回值 (2)shell返回值:指system所调用的shell命令的返回值,比如 ...

  9. 决定c++语言中函数的返回值类型的是,全国2009年10月高等教育自学考试C++程序设计试题及部分参考答案...

    全国2009年10月高等教育自学考试 C++程序设计试题 课程代码:04737 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码 ...

最新文章

  1. oracle列名无效字符,案例学习Oracle错误:ORA-00904 invalid column name
  2. 任谦:实践是大数据提升项目的灵魂丨优秀毕业生专访
  3. 模板格式丢失_公司法人私章证明丢失应该怎么办,需要补办吗?
  4. 【例3.5】位数问题
  5. C++对C的函数扩展
  6. 计算机最小二乘法拟合,数值计算_第6章 曲线拟合的最小二乘法.doc
  7. 第10步 (1)logback.xml日志配置(2) ftp(上传文件)服务器配置(3) idea注入和自动编译配置(4)项目提交gitee(5)fe助手和restlet client
  8. java rop_Java命令行界面(第23部分):Rop
  9. mysql中limit关键字_【JAVA】关于mysql的limit关键字使用。
  10. JeecgBoot单体升级微服务之二
  11. mysql redis geo_利用Redis的Geo功能实现查找附近的位置
  12. ON DELETE CASCADE和ON UPDATE CASCADE
  13. SHELL中,如何分割字符串
  14. libsuperuser
  15. PhpED和Zend Studio for Eclipse的Debugger配置
  16. oracle日期函数有效,oracle日期处理函数整理
  17. 【C/C++笔记】之显式调用DLL、隐式调用DLL、查看DLL输出函数
  18. AI智能双标题插件+内容伪原创插件集成
  19. 编程人员的不二之选 LEGION Y9000X正式发布
  20. 鉴相,鉴频以及环路跟踪算法的理解:

热门文章

  1. asp自定义函数可以返回数组或者对象
  2. Linux利用lsof命令恢复删除的文件
  3. iOS开发-获取设备型号信息
  4. 不使用加减乘除法,完成两个数的加法
  5. MYSQL中LIMIT用法_后台分页
  6. pollepoll实现分析(二)——epoll实现
  7. Python:打印目录下最大的十个文件
  8. 无限互联新浪微博项目(视频)分享
  9. C/C++-标准输入/输出重定向为文件输入/输出
  10. IT十八掌作业_java基础第六天_接口与适配器模式、多态、内部类