getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
2013-07-18 21:35:58
getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析。
- char是字符型数据,如果以为0~255共256个字符,但如果赋给char负数,会怎样?
- 如果将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类型了.
getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析的更多相关文章
- 【转】C/C++ 引用作为函数的返回值
转自:https://blog.csdn.net/weixin_40539125/article/details/81410008 这篇文章写的很好: 语法:类型 &函数名(形参列表){ 函数 ...
- 请为main函数提供返回值
很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的.C/C++ 中从来没有定义过void main( ).C++ 之父 Bjarne Stroustrup 在他的主页上的 ...
- 深入PHP内核之函数和返回值
1.关于返回值,PHP内核中使用了大量的宏来实现,我们先看一个函数 PHP_FUNCTION 宏的定义(Zend/zend_API.h) #define PHP_FUNCTION ZEND_FUNC ...
- Unix系统中system函数的返回值
网上关于system函数的返回值说明很多很详细但却不直观,这里搬出apue 3rd Editon中实现system函数的代码来说明其返回值. #include <sys/wait.h> # ...
- Python函数之返回值、作用域和局部变量
一.函数返回值 说到返回值,相信大家肯定都认识,没错,就是return. 所谓返回值可以这样理解:函数外部的代码要想获取函数的执行结果,就可以在函数里用return语句把结果返回. 那具体怎么用呢?接 ...
- 函数的返回值是如何带出和接收的以及内存中的活动情况.RP
函数返回值时,要生成一个值的副本. 而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** ...
- C语言中函数的返回值
规则 除局部变量的内存地址不能作为函数的返回值外,其他类型的局部变量都能作为函数的返回值. 我总结出下面这些规则: int.char等数据类型的局部变量可以作为函数返回值. 在函数中声明的指针可以作为 ...
- 测试函数用Return 返回值和用函数名返回值的区别
'*************************************************************************'**模 块 名:工程1 - Form1'**说 ...
- Shell入门教程:Shell函数的返回值
shell函数返回值一般有3种方式: 1.return语句(默认的返回值) shell函数的返回值可以和其他语言的返回值一样,通过return语句返回. 比如: #!/bin/bash functio ...
随机推荐
- CentOS 下安装JDK
前提条件 使用干净的centOS 之前肯定没有装过JDK 所以忽略卸载步骤 <1>从SUN下载jdk-1_5_0_14-linux-i586-rpm.bin或jdk-1_5_0_14-li ...
- 前端工程模块化——以一个php项目为例
实现一个页面功能总是需要 JavaScript.CSS 和 Template 三种语言相互组织,所以我们真正需要的是一种可以将 JavaScript.CSS 和 Template 同时都考虑进去的模块 ...
- json 语义分析
json 中:元素与值用冒号 ":" 隔开元素与元素用逗号 "," 隔开{} 之间是一个对象, 对象可以层层嵌套[] 表示数组, 数组元素用逗号 ", ...
- Python学习_算数运算函数
记录以grades列表为例,分别定义输出.求和.平均值.方差和标准差函数,并输出相应的值 grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90 ...
- 通过 struct 成员地址 获取 struct 结构体地址
1. 问题描述: 现在定义了一个结构体: struct Foo { int a; int b; }; Foo foo; 假如由于函数传参等原因,现在程序只能拿到 foo.b 的地址,这时想通过某种方法 ...
- PID控制器的数字实现及C语法讲解
PID控制器的数字实现及C语法讲解 概述 为方便学习与交流,根据自己的理解与经验写了这份教程,有错误之处请各位读者予以指出,具体包含以下三部分内容: (1) PID数字化的推导过程(实质:微积分的近 ...
- c# 模拟表单提交,post form 上传文件、大数据内容
表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...
- 【 Quartz】使用 JobListener (任务监听器可实现) 我想在一个任务执行后在执行第二个任务怎么办呢
http://liuzidong.iteye.com/blog/1147528 Quartz之JobExecutionException 博客分类: Java Quartz quartzjobexec ...
- phpstorm运行在浏览器中执行php文件报502错误
原因是之前mac自带的php5.5版本被我升级到了5.6 通过phpinfo()查看到目前php5.6的安装目录 重新制定一些interpreter的路径 /usr/local/php5/bin 就可 ...
- ExtJS 添加图标icon
extjs控件有两个属性:一个是iconCls:另一个是icon.通过这两个属性可以对控件添加图标 1.直接引用图标路径 icon: '../icons/application_view_detail ...