c语言整型变量使用注意事项
1.符号转换
C语言每个整型类型都存在无符号和符号两种,即unsigned和signed。一般默认为signed,除非定义时特别指出。
1.1 符号转换场景
1.1.1 赋值时显式转换:
点击查看代码
int i = -2;
unsigned int j = i;
1.1.2 算术表达式中隐式转换
点击查看代码
int i = -2;
unsigned int j = 3;
if(i > j) printf("i > j\n");
1.2 符号转换和类型提升
C语言标准规定,类型不同且符号不同的整型转换时,如果涉及类型提升,先做提升,再做符号转换
点击查看代码
short i = -8;
unsigned int j = i; //0xfffffff8
2.溢出
每种整数类型都有一个表示范围,例如char的范围是-128~127。存储超出范围的值时,发生溢出
溢出在符号和无符号上表现不同
2.1 无符号
在无符号上,当要存储的值不在表示范围内,去除大于最大位数的位,效果类似于:

w表示整型的位数
点击查看代码
unsigned char i = 1, j = 256;
unsigned char m = i + j; // m == 1
2.2 有符号
有符号存在上溢出和下溢出,两种溢出都是去除大于最大位数的位
2.2.1上溢出

出现这个现象,是因为上溢出时,去除开头的0,下一位1以负权参与计算
点击查看代码
char i = 1 + 128; // i == -127; 0 1000 0001,取后八位:1000 0001

2.2.2 下溢出
点击查看代码
char i = -1 - 128; // i == 127; 1 0111 1111,取后八位:0111 1111

出现这个现象,是因为下溢出时,去除开头的1,其余位用原来的权参与计算

浙公网安备 33010602011771号