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

    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类型了.

  • 相关阅读:
    搭建 Linux 下 GitLab 服务器(转)
    sql语法:inner join on, left join on, right join on具体用法
    Android Studio之同一应用创建多个Activity(一)
    java环境变量配置
    老鸟的Python新手教程
    域名注冊以及域名解析设置
    Android在WebView上构建Web应用程序
    利用JasperReport+iReport进行Web报表开发
    android App Widgets
    多数据库下activiti的流程定义缓存问题
  • 原文地址:https://www.cnblogs.com/youngforever/p/3199564.html
Copyright © 2011-2022 走看看