sunwengang blog

C++多字节char、bool、字符常量、浮点数

字数统计: 1.1k阅读时长: 4 min
2019/07/23 Share

wchar_t

程序需要处理的字符集可能无法用一个8位的字节表示,比如日文、汉字等
此时有两种处理方法:

  1. 编译器厂商将char定义16位的字节或者更长
  2. char表示8位的字节,另一种wchar_t表示宽字符类型,可以扩展字符集

wchar_t类型是一种整数类型,因此可以有足够的空间表示系统使用的最大扩展字符集。

iostream使用wcinwcout表示宽字符的输入输出。

C++11新增的char16_tchar32_t

Unicode提供了一种表示各种字符集的解决方案。ASCII码是Unicode的子集。
Unicode给每个字符指定一个编号 – 码点
码点通常类似: U-222B (其中U表示这是一个Unicode字符,222B表示该字符的16进制编号)
另一种针对多语言文本的编码标准是ISO 10646

char16_t使用前缀u表示字符常量或者字符串常量;

char32_t使用前缀U表示字符常量或者字符串常量;

例如:

1
2
char16_t = u'q';
char32_t = U'\U0000222B';

bool布尔类型

C++将非零值解释为true0false
此处bool表示真和假
如果需要打印这个类型的值,可以直接使用%d打印判断是否为0

1
2
3
4
bool is_ready = false;

bool start = -100; //true
bool stop = 0; //false

常量的符号名称 – const限定符

符号名称指出了常量表示的内容(即使用符号来表示一个常量)
符号常量的两种定义方式:

  1. #define A 10 (预处理处理)
  2. const int B = 10; (C++编译器处理,提供类型检查和作用域检查)

例如:

const int Months = 12; //首字母大写或者全部大写,表示常量(非通用约定)

常量Months被初始化后,其值就被固定了,编译器不允许修改这个常量的值。

如果强制修改,g++将指出程序试图给一个只读变量赋值。

关键词const叫做限定符,因为它限定了声明的含义。

创建常量

如果在声明中没有提供具体值,则常量的值是不确定的,且无法修改。

const_test.cpp
1
2
3
4
5
const int pink = 10; //建议在声明中对常量初始化

//TODO 不建议
- const int toes;
- toes = 10;

const和define比较

const相比#define定义常量来说, 优势:

  1. 能够明确指定类型
  2. 可以使用C++的作用域规则将其定义限制在特定的函数或者类文件中
  3. 可以用于复杂的类型,例如数组、结构

浮点数

书写方式

  1. 常用的小数点表示法
1
2
3
12.34
0.231
92.023
  1. E表示法

例如23.3E3表示23.3的三次方。 E可以形容很大或者很小的数。
E后面是负数,表示除以N*10
d.ddE+n表示小数点向右移动n位
d.ddE-n表示小数点向左移动n位
之所以称为浮点数,就是因为小数点的移动

1
2
3
4
4E3
34E-10
31.23e12
12.5e-5

浮点类型float,double,long double

这三个类型是按他们可以表示的有效数位和允许的指数最小范围来描述的。
有效位表示数字当中有效的位数。比如14000的有效位数是2,因为可以精确到千位,其余三位只不过是占位符。
有效位数不依赖小数点的位置。比如12.23的有效位数是4。

C++和C对float的有效位数至少32位。
double至少48位,且不少于float。
long double至少和double一样多。
可以从头文件cfloatfloat.h找到系统的限制!

floatnum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>

int main() {
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield); //fixed-point,将E转换成小数点显示
float tub = 10.0/3.0;
double mint = 10.0/3.0;
const float million = 1.0E6;

cout << "float tub = " << tub <<endl;
cout << "double mint = " << mint <<"\n";
cout << "const float million = " << million <<endl;
cout << "tub * million = " << tub*million <<endl;
cout << "mint * million = " << mint*million<<endl;
return 0;
}

g++ floatnum.cpp编译

生成a.out

执行./a.out

运行结果:

1
2
3
4
5
float tub = 3.333333
double mint = 3.333333
const float million = 1000000.000000
tub * million = 3333333.250000
mint * million = 3333333.333333

说明:

  1. cout会将3333333.250000直接打印成3333333.25 ,而cout.setf将覆盖这种行为;
  2. cout打印6位小数,他是iostream的一个类成员函数,能够精确的控制输出格式、字段宽度、小数位数、采用小数格式还是E格式显示;
CATALOG
  1. 1. wchar_t
  2. 2. C++11新增的char16_t和char32_t
  3. 3. bool布尔类型
  4. 4. 常量的符号名称 – const限定符
    1. 4.1. 创建常量
    2. 4.2. const和define比较
  5. 5. 浮点数
    1. 5.1. 书写方式
    2. 5.2. 浮点类型float,double,long double