1.当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数
例如:
unsigned u = 10;
int i = -42;
std::cout << u + i << std::endl;
2.当赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
例如:
unsigned
char(8位)可以表示0~255区间的值,但如果我们赋了一个区间外的值,比如-1,则实际的结果是该值对256取模后所得的余数,因此,-1赋给unsigned
char后打印显示为255
其中,-1对256的求模运算为:
-1 / 256 = 0…-1,(趋向于负无穷)
易与求模运算混淆的为求余运算,感兴趣的可以去查查二者的区别。
3.signed short int 与 unsigned short int
这两者之间运算时,有符号数并不会转化为无符号数再去做运算
4.signed与unsigned
对于浮点数,前缀符signed与unsigned不能加在float类型或double类型上,实际上,浮点数本身都是有符号数
5.默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是不带符号的
如果我们使用了一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已
6.初始化和赋值是两个完全不同的操作
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代
7.列表初始化:
例如:
int unuts_sold = 0;
int unuts_sold = {0};
int unuts_sold{0};
int unuts_sold(0);
注意:
long double ld = 3.1415926536;
int a{ ld }, b = { ld }; // 错误:转换未执行,因为存在丢失信息的危险
int c( ld ), d = ld; // 正确:转换执行,且确实丢失了部分值
8.默认初始化
1. 如果定义变量时没有指定初值,则变量被默认初始化
2. 如果是内置类型的变量未被显示初始化,它的值由定义的位置决定:
【1】 定义在任何函数体之外的变量被初始化为0:
【2】 定义在函数体内部的内置类型变量将不被初始化:
3. 每个类各自决定其初始化对象的方式
【1】 绝大多数类都支持无须显式的初始化而定义对象
【2】 一些类要求每个对象都显示的初始化,此时如果创建了一个该类的对象而未对其做明确的初始化操作,将引发错误
【3】 类的对象如果没有显示地初始化,则其值由类确定