002 CppPrimer基本内置类型

头文件Dog.h

class Dog
{

};

main.cpp文件

#include<iostream>
#include"Dog.h"
using namespace std;
int main()
{
    int a;
    Dog b;
    cout << "测试" << endl;
    system("pause");
    return 0;
}

句子int a;中,之所以能用int直接定义一个整型对象a,是因为库文件中已经定义好了定义整型对象的整型类。

而对象b库文件中没有定义,只能自己定义类。

C++基本内置类型

类型               含义              机器字                        最小存储空间

bool             布尔型                                                   -

char            字符型                                                16位二进制位

wchar_t            宽字符型                                        16位二进制位

short             短整型             半个机器字                 16位二进制位

int            整型                      1个机器字                  16位二进制位

long            长整型             1个或2个机器字             32位二进制位

float            单精度浮点型                                          6位有效数字

double            双精度浮点型                                      10位有效数字

long double            扩展双精度浮点型                        10位有效数字

void类型

表示没有返回值。

void可以用来声明一个空指针。

void *p;

注解:

  1. bool型也是整型。c++标准没有规定用几个二进制位去存储,1、2、8位都有可能。
  2. C++基本内置类型里面列的前6行都属于整型,是用来存放整数的,后3行属于浮点型,浮点型是用来保存小数的。
  3. sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(longlong)。
  4. 一般各家的C++编译器都会做的比c++国际标准中的最小占据位数都要多一些。
  5. 这些数据类型,默认都是有符号的。

 测试一下在微软windows系统上,这些类的对象最小占据几个2进制位?

main.cpp如下:

#include<iostream>
using namespace std;
int main()
{
    void *p;
    int a;
    cout << "测试:" << endl;
    cout << "在windows系统中,bool占据" << sizeof(bool) << "个字节。" << endl;
    cout << "在windows系统中,char占据" << sizeof(char) << "个字节。" << endl;
    cout << "在windows系统中,wchar_t占据" << sizeof(wchar_t) << "个字节。" << endl;
    cout << "在windows系统中,short占据" << sizeof(short) << "个字节。" << endl;
    cout << "在windows系统中,int占据" << sizeof(int) << "个字节。" << endl;
    cout << "在windows系统中,long占据" << sizeof(long) << "个字节。" << endl;
    cout << "在windows系统中,long long占据" << sizeof(long long) << "个字节。" << endl;
    cout << "在windows系统中,float占据" << sizeof(float) << "个字节。" << endl;
    cout << "在windows系统中,double占据" << sizeof(double) << "个字节。" << endl;
    cout << "在windows系统中,long double占据" << sizeof(long double) << "个字节。" << endl;
    system("pause");
    return 0;
}

运行结果:

注解:

  1. 普通的char类的变量只能保存英文字符。
  2. 宽字符类wchar_t类型的变量能保存中文、日文等非英文字符。
  3. int跟电脑的cpu字长有关,如果cpu字长是32位的,则int占据4个字节二进制长度。如果cpu字长是64位的,则int占据8个字节二进制长度。如果某一数据类型的对象所占据的二进制位数跟电脑的cpu字长一致,则这种类型的数据处理速度最快。
  4. 另:在32位机器和64机器中int类型都占用4个字节,编译器可以根据自身硬件来选择合适的大小。

字符型和宽字符型变量或者对象实际上里面保存的是整数。

  • char类型的字符串对象。

因为它的长度分配是1个字节,即8位,所以它只能保存英文字符。不能保存中文字符(非英文字符)。

#include<iostream>
using namespace std;
int main()
{
    char c;
    c = 'A';
    cout << c << endl;
    printf("%d
",c);
    wchar_t c2;
    c2 = ''; 
    cout << c2 << endl;
    system("pause");
    return 0;
}

注解:

  1. 在电脑里面,一切都是数(0和1组成的数)。'A'是65.
  • bool型对象
#include<iostream>
using namespace std;
int main()
{
    bool a;
    bool b;
    bool c;
    a = true;
    b = false;
    c = 39;  //  布尔型中,非零就是1
    cout << "布尔a是:" << a << endl;
    cout << "布尔b是:"<<b << endl;
    cout << "布尔c是:" << c << endl;
    system("pause");
    return 0;
}

 注解:

  1. bool类型的对象也是数。
  •  有符号和无符号数值类型的取值范围,以char类型为例
#include<iostream>
using namespace std;
int main()
{
    int a;
    short b;
    long c;
    
    a = -12;

    unsigned int a2;
    unsigned short b2;
    unsigned long c2;

    char m;

    unsigned char m2;  
    /*
    8位二进制,能用0、1表示2的8次方个数,0~255
    */
    signed char m3;  
    /*
    一般把最高位设定为符号位,1表示负,0表示正;
    2的7次方可以表示128个数, -128(涉及到补码知识)~127
    */    
    printf("SCHAR_MIN:%d
", SCHAR_MIN);   //signed char最小值 
    printf("SCHAR_MAX:%d
", SCHAR_MAX);   //signed char最大值 
    printf("UCHAR_MAX:%d
", UCHAR_MAX);   //unsigned char最大值

    system("pause");
    return 0;
}

 注解:

  1. char类型的表示范围是为何不是-127~127,而是-128~127,参考:https://www.cnblogs.com/yibeimingyue/p/13382632.html

main.cpp如下:

#include<iostream>
using namespace std;
int main()
{
    unsigned char m2;  
    m2 = -1;
    printf("m2=%d
",m2);
    system("pause");
    return 0;
}

 注解:

为何是255?为何打出来不是-1?

原因:m2定义的是无符号字符型(整型),但是赋值的时候赋值能有符号的-1了,数字在计算机中都是以补码的形式存储的,-1在计算机中的存储形式是:1111 1111(8个1)(见下图的原码-反码-补码表),它会被当成无符号的补码,无符号的话,补码和原码相同,所以原码是1111 1111的话,化成十进制就是255.

  •  浮点型对象
#include<iostream>
using namespace std;
int main()
{
    float f = 1234567890123456789.0123456789;
    printf("%f
",f);
    system("pause");
    return 0;
}

 注解:

前7位是准确的,所以在微软c++浮点型数据对象只有7个有效数字(国际标准中要求最小6位有效数字)。

#include<iostream>
using namespace std;
int main()
{
    double f = 1234567890123456789.0123456789;
    printf("%f
",f);
    system("pause");
    return 0;
}

注解:

前17位是准确的,所以在微软c++双精度型数据对象有17个有效数字(国际标准中c++要求最小10位有效数字)。

#include<iostream>
using namespace std;
int main()
{
    long double f = 1234567890123456789.0123456789;
    printf("%f
",f);
    system("pause");
    return 0;
}

注解:

  1. 前17位是准确的,所以在微软c++ long double型数据对象仍然有17个有效数字(国际标准中c++要求最小10位有效数字)。
  2. double 的有效数字已经足够存储带小数点的大数。
  3. float 和 double类的对象主要就是用来保存带小数点的小数的,主要不是用来保存带小数点的很大的大数的。如果保存很大的整数,long long , long ,int就可以。
  4. 整型数据存取速度很快,浮点型数据存取速度很慢。
#include<iostream>
using namespace std;
int main()
{
    long double f = 9.0123456789;
    printf("%f
",f);
    system("pause");
    return 0;
}

注解:

double或者long double型对象存储7位有效数字(?)。

总结:

  1. 定义整型对象一般用int
  2. 定义小数一般用double,它比float型对象的存取还要快。
原文地址:https://www.cnblogs.com/yibeimingyue/p/13380577.html