C++自学记录(基本内置类型)

目录

基本内置类型

算术类型

带符号类型和无符号类型

如何选择类型

类型转换

 关于布尔值与非布尔值的转换

含有无符号类型的表达式 

字面值常量

整型和浮点型字面值

字符和字符串字面值

转义序列 

布尔字面值和指针字面值 


​​​​​​​

基本内置类型

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

算术类型包括:字符、整数型、布尔值和浮点数。空类型不对应具体的值,仅用于一些特殊的场合,最常见的就是,当函数不返回任何值时使用空类型作为返回类型。

算术类型

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

算术类型的尺寸(也就是该类型数据所占的比特数)在不同机器上有所差别。

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

C++提供了几种字符类型,其中基本的字符类型是char,一个char的空间应确保可以存放机器基本字符集中对应的数字值。也就是说,一个char的大小和一个机器字符一样。

其他字符类型用于拓展字符集,如:wchar_t、char16_t、char32_t。wchar_t类型用于确保可以存放机器最大扩展集中的任意一个字符,类型char16_t和char32_t则为Unicode字符集服务(Unicode是用于表示所有自然语言中的字符的标准)。

浮点型可表示单精度、双精度和扩展精度值。C++标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度。通常,float以1个字(32比特)来表示,double以2个字(64比特)来表示,long double以3或4个字(96或128比特)来表示。一般来说,类型float和double分别有7和16个有效位:类型long double则常常被用于特殊浮点需求的硬件,它的具体实现不同,精度也各不相同。

带符号类型和无符号类型

除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)无符号的(unsigned)两种。带符号类型可以表示正数、负数和0。

无符号类型类型则仅能表示大于等于0的值。

类型int、short、long和long long都是带符号的,通常在这些类型名前添加unsigned就可以就可以得到无符号类型,例如:unsigned long。类型unsigned int可以缩写为unsigned。

与整型不同,字符型被分为三种:char、signed char和unsigned char。注意的是:类型char和类型signed char并不一样。其表现型只有两种:带符号的和不带符号的。类型char实际上会表现为其中的一种,具体是哪种由编译器决定。

无符号类型中所有比特都用来存储值,比如:8比特的unsigned char可以表示0至255区间内的值。

C++标准并没有规定带符号类型应如何表示,但是约定了在表示范围内正值和负值的量应该平衡。大多数现代计算机将实际的表示范围定为-128至127。

如何选择类型

如果你的数值超过int的表示范围,选用long long

在算术表达式中不要使用char或bool,只有在存放字符或布尔值时才使用它。

执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。

类型转换

对象的类型定义了对象能包含的数据和能参与的运算,其中一种运算被大多数类型支持,就是将对象从一种给定的类型转换(convert)

  • 当我们把一个非布尔类型的算术值赋给布尔类型时,,初始值为0则结果为false,否则结果为true。
bool = int
  • 当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1。
  • bool = int

  • 当我们把一个浮点数赋给整数类型时,进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。
    int = 0.xx
  • 当我们赋给无符号类型一个超出它表示范围的值,结果是初始值对无符号类型表示数值总数取模后的余数。例如:8比特大小的unsigned char可以表示0至255区间内的值,如果我们赋了一个区间外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char所得的结果是255.
  • 当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined),此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。

 关于布尔值与非布尔值的转换

如果我们使用了一个非布尔值作为条件,那么它会被自动地转换成布尔值,这一做法和把非布尔值赋给布尔变量时的操作完全一样。

int i = 42;
    if(i)    //if条件的值将为true
        i = 0;

含有无符号类型的表达式 

当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数。把int转换成无符号数的过程和把int直接赋给无符号变量一样:

unsigned u = 10;
int I = -42;
std::cout << i + i << std::endl;
std::cout << u + i << std::endl;

第二个输出表达式里,相加前首先把整数-42转换成无符号数。把负值转换成无符号数类似于直接给无符号数赋给一个赋值,结果等于这个负数加上无符号数的模。

unsigned u1 = 42,u2 = 10;
std::cout << u1 - u2 << std::endl;    //正确:输出32
std::cout << u2 - u1 << std::endl;    //正确:不过,结果是取模后的值(4294967264)

在无符号(int)的循环中不要使用u>=0;--u;要不然得到-1会被合法转换成4294967295,会陷入死循环。

字面值常量

一个形如42的值被称为字面值常量(literal) 。每个字面量常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。

整型和浮点型字面值

我们可以将整型字面值写作十进制数、八进制数或十六进制数的形式。以0开头的整数代表八进制数,以0x或0X开头的代表十六进制的数。

字符和字符串字面值

由单括号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串字面值;

‘a’    //字符字面值
“hello world”   //字符串字面值

转义序列 

有两类字符程序员不能直接使用:一类是不可打印(nonprintable)的字符,如退格或其他控制字符,因为它们没有可视的图符;另一类是在C++语言中有特殊含义的字符(单引号、双引号、问好、反斜线)。在这些情况下需要用到转义序列(escape sequence),转义序列均以反斜线作为开始,C++语言规定的转义序列包括:

换行符        \n 横向制表符        \t 报警(响铃)符        \a
纵向制表符  \v 退格符        \b 双引号        \"
反斜线        \\ 问号        \? 单引号        \ ‘
回车符        \r 进纸符        \f

我们也可以使用泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。

\7(响铃) \12(换行符) \40(空格)
\0(空字符) \115(字符M) \x4d(字符M)

  

布尔字面值和指针字面值 

true和false是布尔类型的字面值:

bool test = false;

 nullptr是指针字面值。

Guess you like

Origin blog.csdn.net/weixin_60154963/article/details/121730763