Chapter 2 Data Types and Arithmetic Operators
Integer numbers
int是我们非常常用的整数类型
我们要注意,变量在声明之后最好要初始化,否则里面存放的数据全是垃圾数据
Different integer types
我们先看下int存放数据的结构
signed and unsugned
如果是符号类型的int,他的第一位是一个符号位置,因此最大的就是0后面+31个1。因此表示$$2^{31}-1$$
超过这个就不可以了,但是无符号的就能从0开始一直到如图中展示。
当不考虑范围的时候,运算结果很可能超出表示范围进而产生overflow
Different Data Types for Integer
这个表格详细列出来了不同的integer类型可以参考。
sizeof
sizeof operator can return the width in bytes.
It is an operator, not a function!
因为有的时候你可以把int这种类型也放进去,如果是函数只能放进变量。
More Integer Types
char
标准没有规定char是signed还是unsigned
汉字很多没法用ascii编码,采用更多位数来编码,上面u小写是转换char16_t,下面的U大写转换同理。
bool
1.A C++ keyword, but not a C keyword
2.bool width: 1 byte (8 bits), NOT 1 bit!
3.Value: true (1) or false (0)
只要不是0就全是1!
在c语言中的bool一般采用typedef的方式,或者导入stdbool.h
size_t
实际上,size_t
是个无符号整型(不能存放负数),它并不是一个全新的数据类型,更不是一个关键字。size_t
是由typedef
定义而来的,我们在很多标准库头文件中都能发现。
size_t
的含义是_size type_,是一种计数类型。取值范围与机器架构与操作系统相关。32 位机器一般是unsigned int
,占 4 字节;而 64 位机器一般是unsigned long
,占 8 字节。
size_t
类型隐含着本机理论所能容纳建立最大对象的字节数大小的含义,因此常被用于数组索引、内存管理函数中。
fixed width integer types
左侧type开头的u是无符号的。
右边是提供的一些macros定义,表达一定位数的数值的最大最小。
Floating-point numbers
看这个链接,ppt讲的不是很清楚。
Constant numbers and constant variables
常量也是有类型的类型。
把一个常量赋值给已经设定好类型的变量时,如果常量的类型与变量的类型不一致,编译器会进行类型转换。
-
整数常量:
95
是十进制整数,默认为int
类型。0137
是八进制数,前缀0
表示八进制,编译器会把它当作整数处理。0x5F
是十六进制数,前缀0x
表示十六进制,表示整数。
-
浮点数常量:
3.14159
是一个浮点数,默认为double
。6.02e23
使用科学记数法表示浮点数。6.02e23f
表示float
类型(通过后缀f
确定类型)。6.02e23L
表示long double
类型(通过后缀L
确定类型)。
-
整数类型后缀:
95u
表示unsigned int
(通过后缀u
来定义)。95l
表示long
(通过后缀l
来定义)。95ul
或95lu
表示unsigned long
(通过组合后缀ul
或lu
来定义)。
定义好的const不可以改变
auto
Arithmetic operators
- 一元加号一般没有实际作用,更多是为了代码可读性,表示这个数是正数。
- 一元减号在需要将数值变为负数时比较常用。
int a = 5;
int b = -a; // b 等于 -5
红线是先赋值给b再++
绿线是先++再赋值给b
Special notes
数据类型的转换
数据损失
除法
17是一个常量类型int的,5也是,因此两者算完了就是3,强制转换为float.
但是第二个是float类型的除法,因此可以
Distinct Operations for Different Types
+法做的是int类型,因此a和b全部转换成int类型,有32位,因此加完了是256不是0.
所有的全部转换成没有损失的类型,就是精度最高的类型。
Ref: https://en.cppreference.com/w/cpp/language/implicit_conversion