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;
注解:
- bool型也是整型。c++标准没有规定用几个二进制位去存储,1、2、8位都有可能。
- C++基本内置类型里面列的前6行都属于整型,是用来存放整数的,后3行属于浮点型,浮点型是用来保存小数的。
- sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(longlong)。
- 一般各家的C++编译器都会做的比c++国际标准中的最小占据位数都要多一些。
- 这些数据类型,默认都是有符号的。
测试一下在微软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; }
运行结果:
注解:
- 普通的char类的变量只能保存英文字符。
- 宽字符类wchar_t类型的变量能保存中文、日文等非英文字符。
- int跟电脑的cpu字长有关,如果cpu字长是32位的,则int占据4个字节二进制长度。如果cpu字长是64位的,则int占据8个字节二进制长度。如果某一数据类型的对象所占据的二进制位数跟电脑的cpu字长一致,则这种类型的数据处理速度最快。
- 另:在32位机器和64机器中int类型都占用4个字节,编译器可以根据自身硬件来选择合适的大小。
字符型和宽字符型变量或者对象实际上里面保存的是整数。
- char类型的字符串对象。
因为它的长度分配是1个字节,即8位,所以它只能保存英文字符。不能保存中文字符(非英文字符)。
#include<iostream> using namespace std; int main() { char c; c = 'A'; cout << c << endl; printf("%d\n",c); wchar_t c2; c2 = '中'; cout << c2 << endl; system("pause"); return 0; }
注解:
- 在电脑里面,一切都是数(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; }
注解:
- 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\n", SCHAR_MIN); //signed char最小值 printf("SCHAR_MAX:%d\n", SCHAR_MAX); //signed char最大值 printf("UCHAR_MAX:%d\n", UCHAR_MAX); //unsigned char最大值 system("pause"); return 0; }
注解:
- 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\n",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\n",f); system("pause"); return 0; }
注解:
前7位是准确的,所以在微软c++浮点型数据对象只有7个有效数字(国际标准中要求最小6位有效数字)。
#include<iostream> using namespace std; int main() { double f = 1234567890123456789.0123456789; printf("%f\n",f); system("pause"); return 0; }
注解:
前17位是准确的,所以在微软c++双精度型数据对象有17个有效数字(国际标准中c++要求最小10位有效数字)。
#include<iostream> using namespace std; int main() { long double f = 1234567890123456789.0123456789; printf("%f\n",f); system("pause"); return 0; }
注解:
- 前17位是准确的,所以在微软c++ long double型数据对象仍然有17个有效数字(国际标准中c++要求最小10位有效数字)。
- double 的有效数字已经足够存储带小数点的大数。
- float 和 double类的对象主要就是用来保存带小数点的小数的,主要不是用来保存带小数点的很大的大数的。如果保存很大的整数,long long , long ,int就可以。
- 整型数据存取速度很快,浮点型数据存取速度很慢。
#include<iostream> using namespace std; int main() { long double f = 9.0123456789; printf("%f\n",f); system("pause"); return 0; }
注解:
double或者long double型对象存储7位有效数字(?)。
总结:
- 定义整型对象一般用int
- 定义小数一般用double,它比float型对象的存取还要快。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2019-07-26 sort()函数中的key
2019-07-26 Python的私有变量与装饰器@property的用法