• 2019年2月5日训练日记关于int字节数,long int 字节数的讨论


    今天做到了个非常有意思的题目,是关于int最大最小值。用sizeof(int)查寻,返回四个字节,4个字节计算应该是4*8=32位,其中一位为符号位,且最高为不能为2所以应该减一,2^31-1=2147483648-1=2147483647同理负数也应存在-2147483647,但是当+2147483647+1此时最高为进一也能表示所以,负数最小值应该为-2147483648。
    但是同样的我用sizeof(long int)去查询字节的时候竟然也是4字节,
    去网上大神给出了以下结论

    可用如sizeof(char),sizeof(char*)等得出
    32位编译器:
    char :1个字节
    char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
    short int : 2个字节
    int: 4个字节
    unsigned int : 4个字节
    float: 4个字节
    double: 8个字节
    long: 4个字节
    long long: 8个字节
    unsigned long: 4个字节
    64位编译器:
    char :1个字节
    char*(即指针变量): 8个字节
    short int : 2个字节
    int: 4个字节
    unsigned int : 4个字节
    float: 4个字节
    double: 8个字节
    long: 8个字节
    long long: 8个字节
    unsigned long: 8个字节

    然而有去查编译器是否存在其他关系,是否64位操作系统可以运行32位编译器,也有 64位系统下编译器是32位的说法,后来又看到了Windows的64位,long是4byte , Linux下的64位,long是8byt,后又看到了字节数没变,变得是位数,48与416但是难道int跟long int不是一台电脑跑出来的,一个是48一个是416,感觉闹了笑话。决定字节做实验,发现

    #include<iostream>
    #include<cmath>
    #include<iomanip>
    #include<limits.h>
    using namespace std;
    int main()
    {
        long int a,b;
        long int c;
        long long int d;
        cin>>a>>b;
        c=d=a+b;
        cout<<c<<endl<<d;
        return 0;
    }
    

    发现无论跑多大的数都是一样的,莫不是long long int跟long int 和int一样大,后来检查程序发现c=d=a+b;将a+b的值赋给d,再将d的值赋给c不一样就鬼了。
    于是换程序再跑

       #include<iostream>
        #include<cmath>
        #include<iomanip>
        #include<limits.h>
        using namespace std;
        int main()
        {
            long int a,b;
            long int c;
            long long int d;
            int e;
            cin>>a>>b;
            c=a+b;
            d=a+b;
            e=a+b;
            cout<<c<<endl<<d<<endl<<e;
            return 0;
        }
    

    跑出来cde的值都一样,又想起是不是long int 计算的结果值事long int。在换程序再跑。

    #include<iostream>
    #include<cmath>
    #include<iomanip>
    #include<limits.h>
    using namespace std;
    int main()
    {
        long int a,b;
        long int c;
        long long int d;
        int e;
        cin>>a>>b;
        c=a+b;
        d=a+b;
        e=a+b;
        cout<<c<<endl<<d<<endl<<e;
        return 0;
    }
    
    

    输入2147483647 2147483647
    输出-2
    输入4294967294
    输出-2
    在尝试跑各种数字,发现大于2147483647 时c,e输出是一样的数字,其余的输出的是c,d,e都一样。
    到目前从开始写这篇文章,到现在过去了快两个小时。查了部分资料,后来发现书上也给了资料说上述大神回复,跟编译器的位数有关,而网络上也分说不一,暂时以编译器mingw32是32为编译器收尾。而对于存储的位数,计算机的位数不要相信,课本不要相信,回帖也不要相信,应该用sizeof(long int)通过程序论证了sizeof的必然正确性,否定了某回帖的字节数不变位数改变的论述。
    想去下一个visual studio x64版本去论证64位系统下编译器为32位的可能性。但是苦于在老家没有无线网络,只有手机热点,2.5G的大小有点吃不消,所以暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!暂且保留问题!!!

  • 相关阅读:
    团队冲刺2---个人工作总结一(5.25)
    第十二周学习进度
    课堂作业——找水王
    个人冲刺07
    第十五周学习进度情况
    构建之法阅读笔记06
    构建之法阅读笔记05
    第十四周学习进度情况
    个人冲刺06
    个人冲刺05
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12799115.html
Copyright © 2020-2023  润新知