1、整型的基本概念
C++用int关键字来声明整型变量(int 是 integer 的简写)。
在声明整型变量的时候,可以在int关键字之前加signed、unsigned、short和long四种修饰符。
signed:有符号的,可以表示正数和负数。
unsigned:无符号的,只能表示正数,例如超女的身高和体重等。
short:短的,取值范围小,占用内存少。
long:长的,取值范围大,占用内存多。
类型简写 | 类型全称 | 长度 | 取值范围 |
short | signed short int | 2字节 | -32768~32767 |
unsigned short | unsigned short int | 2字节 | 0~65535 |
int | signed int | 4字节 | -2147483648~2147483647 |
unsigned | unsigned int | 4字节 | 0~4294967295 |
long | signed long int | 8字节 | -9223372036854775808~ 9223372036854775807 |
unsigned long | unsigned long int | 8字节 | 0~18446744073709551615 |
注意:
(1)整数的取值范围与计算机操作系统和C++语言编译器有关,没有一个固定的数值,我们可以根据它占用的内存大小来推断它的取值范围。
一个位的取值是 0 1 1=21-1
两个位的取值是 00 01 10 11 3=22-1
三个位的取值是 000 001 …… 111 7=23-1
a)一个字节有8个位,表示的数据的取值范围是28-1,即255。
b)如果占用的内存是两个字节,无符号型取值范围是28ⅹ28-1。
c)如果占用的内存是四个字节,无符号型取值范围是28ⅹ28ⅹ28ⅹ28-1。
d)如果占用的内存是八个字节,无符号型取值范围是28ⅹ28ⅹ28ⅹ28ⅹ28ⅹ28ⅹ28ⅹ28-1。
e)如果是有符号,取值范围减半,因为符号占一个位。
f)计算机用最高位1位来表达符号(0-正数,1-负数),unsigned修饰过的正整数不需要符号位,在表达正整数的时候比signed修饰的正整数取值大一倍。
(2)给整型变量赋值不能超出它的取值范围,否则能产生不可预后的后果。
(3)在实际开发中,为了防止超出取值范围,应该保证有足够的空间。
2、整数的书写
整数默认是十进制,一个表示十进制的数字不需要任何特殊的格式。
(1)二进制
二进制由 0 和 1 两个数字组成,书写时必须以0b或0B(不区分大小写)开头。
以下是合法的二进制:
int a = 0b101; // 换算成十进制为 5
int b = -0b110010; // 换算成十进制为 -50
int c = 0B100001; // 换算成十进制为 33
以下是非法的二进制:
int m = 101010; // 无前缀 0B,相当于十进制
int n = 0B410; // 4不是有效的二进制数字
注意,C++标准并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。
(2)八进制
八进制由 0~7 八个数字组成,书写时必须以0开头(注意是数字 0,不是字母 o)。
以下是合法的八进制数:
int a = 015; // 换算成十进制为 13
int b = -0101; // 换算成十进制为 -65
int c = 0177777; // 换算成十进制为 65535
以下是非法的八进制:
int m = 256; // 无前缀 0,相当于十进制
int n = 03A2; // A不是有效的八进制数字
(3)十六进制
十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,书写时必须以0x或0X(不区分大小写)开头。
以下是合法的十六进制:
int a = 0X2A; // 换算成十进制为 42
int b = -0XA0; // 换算成十进制为 -160
int c = 0xffff; // 换算成十进制为 65535
以下是非法的十六进制:
int m = 5A; // 没有前缀 0X,是一个无效数字
int n = 0X3H; // H不是有效的十六进制数字
(4)需要注意的坑
在C++中,不要在十进制数前面加0,会被编译器当成八进制。
还有,不要随便删掉别人程序中整数前面的0,它不是多余的。
3、C++11的long long类型
在VS中,long是4字节,32位。 -2147483648~2147483647
在Linux中,long是8字节,64位。 -9223372036854775808~9223372036854775807
C++11标准增了long long类型的整数,至少64位,且至少与long一样长。
在VS中,long long是8字节,64位。 -9223372036854775808~9223372036854775807
在Linux中,long和long long类型都是8字节,64位。
4、浮点型(实数型)
C++浮点型分三种:float(单精度)、double(双精度)、long double(扩展精度)。
三者的区别是表示有效数字的范围不同。
数据类型 | 占用空间 | 有效数字范围 |
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
long double | 不少于double | 不低于double |
注意:
(1)在VS和Linux中,long double占用的内存空间分别是8和16字节。
(2)有效数字包括了小数点前面和后面的数字。
(3)C++缺省显示6位有效数字,如果要显示更多的有效数字,可以用printf()函数。
(4)浮点数的存储方法和整数不一样,比较复杂,如无必要,不用研究。(百度“为什么浮点数的小数位很多”、“为什么浮点数不精确”)
在实际开发中,用整数代替浮点数,整数的运算更快,精度更高。9223372036854775807
5、字符型的基本概念
字符型(char)占用的内存空间是1个字节,书写用单引号包含。
在内存中,不存放字符本身,而是存放与它对应的编码,即ASCII码。
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是现今最通用的单字节编码方案,包含了33个控制字符(具有特殊含义无法显示的字符)和95个可显示字符。
'X' -> 88 01011000 'a'->97 01100001 '3'->51 00110011
(1)ASCII 控制字符 (0~31)
十进制 | 符号 | 中文解释 | 十进制 | 符号 | 中文解释 |
0 | NULL | 空字符 | 16 | DLE | 数据链路转义 |
1 | SOH | 标题开始 | 17 | DC1 | 设备控制 1 |
2 | STX | 正文开始 | 18 | DC2 | 设备控制 2 |
3 | ETX | 正文结束 | 19 | DC3 | 设备控制 3 |
4 | EOT | 传输结束 | 20 | DC4 | 设备控制 4 |
5 | ENQ | 询问 | 21 | NAK | 拒绝接收 |
6 | ACK | 收到通知 | 22 | SYN | 同步空闲 |
7 | BEL | 铃 | 23 | ETB | 传输块结束 |
8 | BS | 退格 | 24 | CAN | 取消 |
9 | HT | 水平制表符 | 25 | EM | 介质中断 |
10 | LF | 换行键 | 26 | SUB | 替换 |
11 | VT | 垂直制表符 | 27 | ESC | 换码符 |
12 | FF | 换页键 | 28 | FS | 文件分隔符 |
13 | CR | 回车键 | 29 | GS | 组分隔符 |
14 | SO | 移出 | 30 | RS | 记录分离符 |
15 | SI | 移入 | 31 | US | 单元分隔符 |
(2)ASCII 可显示字符 (32~127)
十进制 | 符号 | 中文解释 | 十进制 | 符号 | 中文解释 |
32 | 空格 | 80 | P | 大写字母 P | |
33 | ! | 感叹号 | 81 | Q | 大写字母 Q |
34 | " | 双引号 | 82 | R | 大写字母 R |
35 | # | 井号 | 83 | S | 大写字母 S |
36 | $ | 美元符 | 84 | T | 大写字母 T |
37 | % | 百分号 | 85 | U | 大写字母 U |
38 | & | 与 | 86 | V | 大写字母 V |
39 | ' | 单引号 | 87 | W | 大写字母 W |
40 | ( | 左括号 | 88 | X | 大写字母 X |
41 | ) | 右括号 | 89 | Y | 大写字母 Y |
42 | * | 星号 | 90 | Z | 大写字母 Z |
43 | + | 加号 | 91 | [ | 左中括号 |
44 | , | 逗号 | 92 | \ | 斜线 |
45 | - | 减号 | 93 | ] | 右中括号 |
46 | . | 句点或小数点 | 94 | ^ | 音调符号 |
47 | / | 反斜线 | 95 | _ | 下划线 |
48 | 0 | 数字0的符号 | 96 | ` | 重音符 |
49 | 1 | 数字1的符号 | 97 | a | 小写字母 a |
50 | 2 | 数字2的符号 | 98 | b | 小写字母 b |
51 | 3 | 数字3的符号 | 99 | c | 小写字母 c |
52 | 4 | 数字4的符号 | 100 | d | 小写字母 d |
53 | 5 | 数字5的符号 | 101 | e | 小写字母 e |
54 | 6 | 数字6的符号 | 102 | f | 小写字母 f |
55 | 7 | 数字7的符号 | 103 | g | 小写字母 g |
56 | 8 | 数字8的符号 | 104 | h | 小写字母 h |
57 | 9 | 数字9的符号 | 105 | i | 小写字母 i |
58 | : | 冒号 | 106 | j | 小写字母 j |
59 | ; | 分号 | 107 | k | 小写字母 k |
60 | < | 小于 | 108 | l | 小写字母 l |
61 | = | 等号 | 109 | m | 小写字母 m |
62 | > | 大于 | 110 | n | 小写字母 n |
63 | ? | 问号 | 111 | o | 小写字母 o |
64 | @ | 电子邮件符号 | 112 | p | 小写字母 p |
65 | A | 大写字母 A | 113 | q | 小写字母 q |
66 | B | 大写字母 B | 114 | r | 小写字母 r |
67 | C | 大写字母 C | 115 | s | 小写字母 s |
68 | D | 大写字母 D | 116 | t | 小写字母 t |
69 | E | 大写字母 E | 117 | u | 小写字母 u |
70 | F | 大写字母 F | 118 | v | 小写字母 v |
71 | G | 大写字母 G | 119 | w | 小写字母 w |
72 | H | 大写字母 H | 120 | x | 小写字母 x |
73 | I | 大写字母 I | 121 | y | 小写字母 y |
74 | J | 大写字母 J | 122 | z | 小写字母 z |
75 | K | 大写字母 K | 123 | { | 左大括号 |
76 | L | 大写字母 L | 124 | | | 竖线 |
77 | M | 大写字母 M | 125 | } | 右大括号 |
78 | N | 大写字母 N | 126 | ~ | 波浪号 |
79 | O | 大写字母 O | 127 | 删除 |
a)32是空格。
b)48~57是0到9十个阿拉伯数字;
c)65~90是26个大写英文字母;
d)97~122号是26个小写英文字母;
e)其余的是一些标点符号、运算符号等;
f)第127个字符表示的是键盘上的删除键。
(3)字符的本质
a)字符的本质是整数,取值范围是0~127。
b)在书写的时候可以用单引号包含,也可以用整数。
c)如果书写的时候用单引号包含,程序执行的时候,将把符号解释为对应的整数。
d)显示的时候,把整数解释为对应的符号,也可以直接显示整数。
d)可以与整数进行任何运算,运算的时候,书写方式可以用字符,也可以用整数。
e)C++为什么没有提供1字节的整型?
f)字符型也可以用unsigned修饰,意义何在?
6、转义字符
在C++程序中,使用转义字符的原因有两个:
(1)控制字符没有符号,无法书写,只能用其它的符号代替。
(2)某些符号已被C++征用,语义冲突,只能用其它的符号代替。
ASCII码值 | 转义字符 | 含义 |
0 | \0 | 空,给字符型变量赋值时可以直接书写0。 |
10 | \n | 换行(LF) ,将当前位置移到下一行开头。 |
13 | \r | 回车(CR) ,将当前位置移到本行开头 |
9 | \t | 水平制表(HT) (跳到下一个TAB位置) |
92 | \\ | 斜线 |
34 | \" | 双引号,书写字符时不必转义。 |
39 | \' | 单引号,书写字符串中不必转义。 |
7 | \a | 警报 |
8 | \b | 退格(BS) ,将当前位置移到前一列 |
12 | \f | 换页(FF),将当前位置移到下页开头 |
11 | \v | 垂直制表(VT) |
7、C++11的原始字面量
原始字面量(值)可以直接表示字符串的实际含义,不需要转义和连接。
语法:
R"(字符串的内容)"
R"xxx(字符串的内容)xxx"
8、字符串型
C++风格字符串:
string 变量名="字符串的内容" ;
C风格字符串:
char 变量名[]="字符串的内容" ;
C风格字符串的本质是字符数组,C++风格字符串的本质是类,它封装了C风格字符串。
C++风格字符串的常用操作:
赋值:变量名="字符串的内容" ;
拼接:变量名=变量名+"字符串的内容一"+"字符串的内容一"+......+"字符串的内容n" ;
如果字符串的内容都是常量,不要写加号(+),如果内容很长,可以分成多行书写。
比较:支持==、!=、>和<关系运算符,常用的是==和!=。
9、布尔型
在C和C++中,关系运算和逻辑运算的结果有两种:真和假。
C语言用0表示假,非0表示真。
为了提高代码的可读性,C++新增了 bool 类型,占用1字节的内存,用true表示真,false表示假。
bool类型本质上是1字节的整数(unsigned char),取值只有1和0。
在程序中,书写的时候可以用true和false,编译器把它们解释为1和0。
如果对bool型变量赋非0的值,将转换成1。
用cin输入和cout输出的时候,仍是1和0,不会被解释为true和false。
10、数据类型的转换
计算机进行运算时,要求各操作数的类型具有相同的大小和存储方式。
在实际开发中,不同类型的数据进行混合运算是基本需求。
自动类型转换:某些类型的转换编译器可以隐式的进行,不需程序员干预。
强制类型转换:有些类型的转换需要程序员显式指定。
(1)自动类型转换
不同数据类型的差别在于取值范围和精度,数据的取值范围越大,精度越高。
整型从低到高:
char -> short -> int -> long -> long long
浮点型从低到高:
float -> double -> long double
自动类型转换的规则如下:
a)如果一个表达式中出现了不同类型操作数的混合运算,较低类型将自动向较高类型转换。
b)当表达式中含有浮点型操作数时,所有操作数都将转换为浮点型。
c)赋值运算的右值类型与左值类型不一致时,将右值类型提升/降低为左值类型。
d)赋值运算右值超出了左值类型的表示范围,把该右值截断后赋给左值,所得结果可能毫无意义。
(2)强制类型转换
为了让程序设计更灵活,转换的目的更清晰,C++提供了强制类型转换的方法,也称之为显式转换。
强制类型转换的语法:(目标类型)表达式或目标类型(表达式)
注意:
a)如果使用强制转换,表示程序员已有明确的目的。
b)如果转换的行为不符合理,后果由程序员承担。
c)如果采用了强制类型转换,编译的告警信息将不再出现。
d)类型转换运算符的优先级比较高,如果没把握就加括号。
11、数据类型的别名typedef
创建数据类型的别名有两个目的:
(1)为名称复杂的类型创建别名,方便书写和记忆。
(2)创建与平台无关的数据类型,提高程序的兼容性。
语法:typedef 原数据类型名 别名;
C++11还可以用using关键字创建数据类型的别名。
语法:using 别名=原数据类型名;
标签:符号,小写字母,数据类型,long,大写字母,int,C++
From: https://blog.csdn.net/m0_69452758/article/details/137070840