C++基本内置类型 4年前

编程语言
178
C++基本内置类型

  (博文参考书籍《C++ Primer 中文版》,摘录易忘知识点和容易混淆的内容)

  C++定义了一套包括算术类型(arithmetic type)和空类型(void)在内的基本数据类型。

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

  空类型不对应具体的值,仅用于一些特定场合,常见的如:函数不返回任何值是,使用空类型作为函数的返回类型。

一、算术类型

  算术类型分为两类:整形(intergral type,包括字符和布尔类型在内)、浮点型。

  算术类型的尺寸(也就是该类型数据所占的比特数)在不同机器上有所差别。下方列出了C++标准规定的尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。某一类型所占的比特数不同,他所能表示的数据范围也不一样。

 

类型

含义

最小尺寸

数据范围

bool

布尔类型

未定义

 

char

字符

8位

带符号:signed char  -128 ~127

无符号:unsiged char  0~255

wchar_t

宽字符

16位

 

char16_t

Unicode字符

16位

 

char32_t

Unicode字符

32位

 

short

短整型

16位

-2的8次方 ~ 2的8次方-1

int

整型

16位

-2的8次方 ~ 2的8次方-1

long

长整型

32位

-2的16次方 ~ 2的16次方-1

long long

长整型

64位

-2的32次方 ~ 2的32次方-1

float

单精度浮点型

6位有效数字

 

double

双精度浮点型

10位有效数字

 

long double

扩展精度浮点型

10位有效数字

 

布尔类型的取值是真(true)或假(false)。

基本的字符类型是char,一个char的空间应确保可以存放机器基本字符集中任意字符对应的数字值。也就是说,一个char的大小和一个机器字节一样。

内置类型的机器实现

  计算机以比特序列存储数据,每个比特非0即1。

  大多数的计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块成为“字节(byte)”,存储的基本单元称为“字(word)”,它通常由几个字节组成。C++语言中,一个字节要至少能容纳机器基本字符集中的字符。大多数机器的字节由8比特构成,字则由32或64比特构成,也就是4或8字节。

  大多数计算机将内存中的每个字节与一个数字(被称为“地址(address)”)关联起来,在一个字节位8比特、字为32比特的机器上,我们可能看到一个字的内存区域如下所示

地址

内容

736424

1 0 0 1 0 1 1 0

736425

0 0 1 1 0 1 0 1

736426

0 1 0 1 0 0 1 1

736427

0 1 1 0 0 1 0 0 

   我们能够使用地址来表述这个地址开始的大小不同的比特串,为了赋予内存中某个地址明确的含义,必须首先知道存储在该地址的数据的类型。类型决定了数据所占的比特数以及该如何解释这些比特的内容。

  带符号类型和无符号类型

 除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。类型int、short、long 和long long都是带符号的,通过在这些类型名前添加unsigned即可得到无符号类型。类型 unsigned int 可以缩写为 unsigned.

  与其他整型不同,字符型被分为了三种:char、 singed char 和unsigned char。特别需要注意的是:类型char 和类型 signed char并不一样。尽管字符型有三种,但是字符的表现形式却只有两种,带符号的和无符号的。类型char 实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。

二、自动类型转换

  1、非布尔型 --> 布尔型:初始值为0则为false,否则为true

  2、布尔型 --> 非布尔型:true --> 1; false --> 0

  3、整数值 --> 浮点型:小数部分记为0

  4、负值 --> 无符号型:结果为初始值对无符号类型表示数值总数取模后的余数。列如:unsigned char 可以表示0~255,我们给个-1,就是对256取模,得到余数255.

    这里我们来看一个代码示例:通过控制变量递减的方式把10到0的数字降序输出

#include <iostream>

using namespace std;

//倒序输出10-0
void DescPrintTenToOne() 
{
    cout << "带符号的" << endl;
    for (int i = 10;i >= 0; i--)//正确,如我们预取的效果一样
    {
        cout << i << endl;
    }
    cout << "无符号的" << endl;
    for (unsigned j = 10; j >= 0; j--) //由于负值向无符号转换,进入了死循环
    {
        cout << j << endl;
    }
}

int main()
{
    DescPrintTenToOne();
    return 0;
}

 下面我们看一下控制台的打印效果

  

  5、当我们给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作、可能崩溃、也可能生成垃圾数据

image
ZIsNull
别人无法左右你,别人只是帮你决定了你犹豫不决的决定而已!
1
发布数
2
关注者
177
累计阅读

热门教程文档

Spring Boot
24小节
Rust
84小节
Lua
21小节
Objective-C
29小节
QT
33小节
广告