zoukankan      html  css  js  c++  java
  • c++编译器对新建字符型数组内部数据的初始化

    =============================================================================================

    20130310_第一次修改                         ccb_warlock

    =============================================================================================

    最近在学习数据结构,应用到了c++去不断的编写改进一个线性表。当我自己在课后编写时的一次错误输出,突然对新建字符型数组内部的ASCII值产生了兴趣,到底新建字符型数组ASCII值是多少呢?于是我编写了下面的程序去验证。


    测试程序1:

    源码部分:
    #include<iostream>
    using namespace std;
    int main()
    {
    char data[10];
    if(data[0]==32)
    cout<<"this is right."<<endl;
    else cout<<"this is error."<<endl;

    //下面代码插入处
    return 0;
    }
    c++编译器对新建字符型数组内部数据的初始化
    由于以前输出时显示不输出,首先我猜想vc++6.0新建数组时是不是将空格作为值给了数组,编写上面程序后发现假设不成立。




    测试程序2:

    那么这里面值到底为多少呢,其实我大可以直接找中间变量输出它原有的ASCII值。

    插入源码
    int testnumble;
    testnumble=data[0];
    cout<<"testnumble :"<<testnumble<<endl;

    这里解释一下负值也可以被作为ASCII码值给予字符型变量的原因。
    因为c++编译器大都对于这样的错误不会报错,不管现在32位和64位的数据,c++对于这些数据都只做截断型取值(大多都取数据后8位为值,至于8位以外的数据编译器自动过滤),然后将过滤后的值送给变量所以对于负值符号位不会作为考虑的因素。

    但是根据上面的思路我大胆猜测如果送入一个负值,按照计算编译器会送入一个正数进入数组。
    首先我查询vc++6.0的发行时间与基本信息,得知vc++6.0集成了MFC6.0,于1998发行。我先猜测它面对处理的数据应该是16位或32位(其实32位的处理与16位处理很接近,所以当操作系统过渡到32位时代时程序的兼容处理问题基本没有)。
    先假定当初的操作系统为32位,那么十进制数-255转成二进制位1111/1111/1111/1111/1111/1111/0000/0001。
    按照截断处理,留下的数据为0000/0001,所以如果我给予的数值为-255时,实际赋值应为十进制1。编写程序检验进行。
    检验程序:
    源码部分:
    #include<iostream>
    using namespace std;
    int main()
    {
    char data[10];
    data[0]=-255;
    int testnumble=data[0];
    cout<<"testnumble :"<<testnumble<<endl;
    return 0;
    }
    c++编译器对新建字符型数组内部数据的初始化

    显示与我想的一样,所以到这可以解决赋值也可以作为ASCII值给予字符型变量。

    但是问题随之而来,如果数据如上处理,那么赋值为-52( 1111/1111/ 1111/1111/1111/1111/1100/1100),应该输出202,可将检验程序的赋值写为-52后,输出的任然是-52.

    *出现这个情况的原因是这样,对于截断后的数据,系统自动将当前数据的最高位(第七位)作为符号位,剩下7位(1001100)的数据按照补码的方式进行处理。按照这样的处理,可以对-128——+127都可以正确赋值。



    经过test2的检测,vc++6.0对其中初始赋值为-52,但是与老师交谈后得知每款c++编译器对于新建数组的赋值不是确定的,于是我下了C-Free 5.0(一款比较简约的c/c++编译程序)进行第三次测试。




    测试程序3:

    源码部分:
    #include<iostream>
    using namespace std;
    int main()
    {
    char data[10];
    int textnumble;
    textnumble=data[0];
    cout<<"textnumble :"<<textnumble<<endl;

    if(data[0]==-60)
    cout<<"this is right."<<endl;
    else cout<<"this is error."<<endl;
    return 0;
    }
    c++编译器对新建字符型数组内部数据的初始化
    验证后C-Free 5.0的编译器对于新建数组的赋值为-60。从而心中的好奇也得到了答案,老师的解答的确是对的,不同编译器对于新建字符型数组的初始化没有规定的数据,我估计这也与c++标准没有规定有关。





    即使有一天在技术上我已经是个能手,请记住自己应有的责任和保持一个真诚交流、始终渴望追求技术的心。                                                                     ----------ccb_warlock

  • 相关阅读:
    20155334 2016-2017-2 《Java程序设计》第四周学习总结
    20155334 2016-2017-2 《Java程序设计》第三周学习总结
    20155334 2016-2017-2 《Java程序设计》第二周学习总结
    20155334 2016-2017-2 《Java程序设计》第一周学习总结
    虚拟机与Linux的初体验
    20155334的第二次随笔
    使用Maven工程
    观察者模式(observer)
    GreenPlum之进程会话管理篇
    Linux下crontab命令添加Kettle作业定时任务
  • 原文地址:https://www.cnblogs.com/straycats/p/5248736.html
Copyright © 2011-2022 走看看