基本内置类型

Posted xiaojianliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本内置类型相关的知识,希望对你有一定的参考价值。

C++的基本内置类型包含空类型和算术类型。

算术类型包含:字符类型、整型数、浮点值、布尔值。

算术类型

算术类型分为两大类:整型,包含字符和布尔类型在内;浮点型。
技术图片

  • 一个 char 的大小和一个机器字节一样。
  • wchar_t 确保可以存放机器最大扩展字符集中的一个字符。
  • char16_tchar32_tUnicode字符集服务。
  • int 至少和 short 一样大。
  • long 至少和 int 一样大。
  • long long 至少和 long 一样大,long long 是C++11新定义的。
  • 计算机可以寻址的最小内存块称为字节,存储的基本单元称为字,一个字通常由几个字节构成,大多数计算机中一个字节包含8个比特,一个字包含4个或者8个字节。
  • 浮点型分为单精度、双精度、扩展精度,通常 float 以1个字表示,double 以两个字表示,long double 以3个或者4个字表示。

带符号类型和无符号类型

除了布尔类型和扩展的字符类型之外,其它整型可以划分为带符号和无符号的。

字符型分为三种:charsigned charunsigned 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)。
  • 默认情况下,十进制字面值是带符号数,八进制和十六进制字面值可能带符号也可能无符号。
  • 十进制字面值是 intlonglong long 中尺寸最小的那个,前提是这种类型包含当前值。
  • 八进制和十六进制字面值的类型是容纳其数值的intunsigned intlongunsigned longlong longunsigned long long
  • short 没有对应的字面值。
  • 浮点型字面值可以采用小数形式,或者科学计数法表示 (E,e)。
  • 默认情况下,浮点字面值是 double 类型。

字符和字符串字面值

  • 单引号括起来的是 char 型字面值,双引号括起来的是字符串字面值。
  • 字符串字面值的类型实际上是由常量字符组成的数组,编译器在每个字符串的结尾处添加一个空字符(‘‘),所以字符串字面值实际长度要比它的内容多1。
  • 分多行书写字符串字面值:
cout << "I am so happy,"
    "today" << endl;

转义序列

两类字符程序员不能直接使用:

  • 不可打印字符,如退格或其他控制字符,因为它们没有可视化图符。
  • C++ 语言中含有特殊含义的字符(单引号,双引号,问号,反斜线)。

对于以上两种强开,需要用到转义序列,转义序列都是以反斜线开始:
技术图片

也可以使用泛化的转义序列,其形式是 x 后紧跟一个或者多个十六进制数,或者 后紧跟一个、两个、三个八进制数字,其中数字部分表示的字符对应的数值,
技术图片

注意:

  • 如果反斜线 后面跟着的八进制数字超过3个,只有前3个数字与 构成转义序列。

指定字面值的类型

技术图片

布尔字面值和指针字面值

  • truefalse 是布尔字面值。
  • nullptr 是指针字面值。

以上是关于基本内置类型的主要内容,如果未能解决你的问题,请参考以下文章

流程控制之for循环基本数据类型及其内置方法

13 个非常有用的 Python 代码片段

JS-安全检测JavaScript基本数据类型和内置对象的方法

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段

基本类型引用类型基本包装类型和单体内置对象

golang的内置类型map的一些事