基本内置类型
Posted xiaojianliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本内置类型相关的知识,希望对你有一定的参考价值。
C++的基本内置类型包含空类型和算术类型。
算术类型包含:字符类型、整型数、浮点值、布尔值。
算术类型
算术类型分为两大类:整型,包含字符和布尔类型在内;浮点型。
- 一个
char
的大小和一个机器字节一样。 wchar_t
确保可以存放机器最大扩展字符集中的一个字符。char16_t
、char32_t
为Unicode
字符集服务。int
至少和short
一样大。long
至少和int
一样大。long long
至少和long
一样大,long long
是C++11新定义的。- 计算机可以寻址的最小内存块称为字节,存储的基本单元称为字,一个字通常由几个字节构成,大多数计算机中一个字节包含8个比特,一个字包含4个或者8个字节。
- 浮点型分为单精度、双精度、扩展精度,通常
float
以1个字表示,double
以两个字表示,long double
以3个或者4个字表示。
带符号类型和无符号类型
除了布尔类型和扩展的字符类型之外,其它整型可以划分为带符号和无符号的。
字符型分为三种:char
、signed char
、unsigned char
。但是表现形式只有两种:带符号的,无符号的。char
类型具体是上述两种类型中的哪一种由编译器决定。
如何选择类型
- 明确知道数值不可能为负时,选用无符号类型。
- 使用int执行整数运算,实际应用中,
short
常常显得更小,long
一般和int
拥有一样的尺寸,如果数值超过了int
,选用long long
。 - 算术表达式中不要使用char或bool。如果需要使用
char
类型,一定要明确指出是signed char
还是unsigned char
。 - 执行浮点运算选用
double
,这是因为float
通常精度不够并且双精度浮点和单精度浮点在计算代价上相差无几,甚至在一些机器上双精度要比单精度更快。long double
提供的精度通常是不必要的,而且它带来的运行时消耗也比较大。
类型转换
对象的类型定义了对象能包含的数据和能参与的运算。类型转换是大多数类型所支持的运算。
当程序在某处使用一种类型,而实际上应该使用另一种类型的时候,程序会自动进行类型转换。
类型所能表示的范围决定了转换过程:
- 非布尔类型赋值给布尔类型,初始值为0则结果是
false
,否则结果为true
。 - 把布尔值赋值给非布尔值时,初始值是
false
则结果为0,初始值为true
则结果是1。 - 浮点数赋值给整数时,结果值仅保留浮点数中小数之前的部分。
- 把整型数赋值给浮点类型时,小数部分记为0,如果该整数所占的空间超过了浮点类型的容量,精度可能会有损失。
- 当给无符号类型赋值一个超出其表示范围的值,结果是初始值对无符号类型表示数值总数取模之后的余数。例如把
-1
赋值给unsigned char
类型,其结果将是255。 - 当给带符号类型一个超出其范围的值,结果将是未定义的,此时程序可能继续工作、可能崩溃、也可能生成垃圾数据。
- 有符号数转换成无符号数时,负数转换成大的正数,相当于在原值上加上了无符号数能够表示的最大数据范围,正数保持不变。
unsigned u = -10;
cout<<u<<endl; //相当于u + UINT_MAX + 1
- 无符号数转换成有符号数时,对于较小的数将保持原值,对于较大的数将转换成负数,相当于原值减去无符号数表示的最大数据范围。
unsigned u = UINT_MAX;
int i = u;
cout << i << endl; //相当于 u - (UINT_MAX+1)
- 当表达式中存在有符号和无符号类型时,所有操作都自动转换成无符号类型。
unsigned u = 10;
int i = -42;
cout << i + u << endl; //UINT_MAX + 1 - 42 + 10
注意:
无符号数错误的使用在循环语句中,导致死循环:
for(unsigned u=10;u>=0;u--)
{
....
}
字面值常量
整型和浮点型字面值
- 整型字面值可以有十进制,八进制(0),十六进制(0x)。
- 默认情况下,十进制字面值是带符号数,八进制和十六进制字面值可能带符号也可能无符号。
- 十进制字面值是
int
、long
、long long
中尺寸最小的那个,前提是这种类型包含当前值。 - 八进制和十六进制字面值的类型是容纳其数值的
int
、unsigned int
、long
、unsigned long
、long long
、unsigned long long
。 - short 没有对应的字面值。
- 浮点型字面值可以采用小数形式,或者科学计数法表示 (E,e)。
- 默认情况下,浮点字面值是
double
类型。
字符和字符串字面值
- 单引号括起来的是
char
型字面值,双引号括起来的是字符串字面值。 - 字符串字面值的类型实际上是由常量字符组成的数组,编译器在每个字符串的结尾处添加一个空字符(‘ ‘),所以字符串字面值实际长度要比它的内容多1。
- 分多行书写字符串字面值:
cout << "I am so happy,"
"today" << endl;
转义序列
两类字符程序员不能直接使用:
- 不可打印字符,如退格或其他控制字符,因为它们没有可视化图符。
- C++ 语言中含有特殊含义的字符(单引号,双引号,问号,反斜线)。
对于以上两种强开,需要用到转义序列,转义序列都是以反斜线开始:
也可以使用泛化的转义序列,其形式是 x
后紧跟一个或者多个十六进制数,或者 后紧跟一个、两个、三个八进制数字,其中数字部分表示的字符对应的数值,
注意:
- 如果反斜线
后面跟着的八进制数字超过3个,只有前3个数字与
构成转义序列。
指定字面值的类型
布尔字面值和指针字面值
true
和false
是布尔字面值。nullptr
是指针字面值。
以上是关于基本内置类型的主要内容,如果未能解决你的问题,请参考以下文章
JS-安全检测JavaScript基本数据类型和内置对象的方法
C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段