c语言整型变量使用注意事项

1.符号转换

C语言每个整型类型都存在无符号和符号两种,即unsigned和signed。一般默认为signed,除非定义时特别指出。

1.1 符号转换场景

1.1.1 赋值时显式转换:
点击查看代码
int i = -2;
unsigned int j = i;
这里的赋值显式地把符号变量i赋值给无符号变量j
1.1.2 算术表达式中隐式转换
点击查看代码
int i = -2;
unsigned int j = 3;
if(i > j) printf("i > j\n");
在上面地代码,根据算数上的比较,应该不会打印" i > j"。实际执行到if语句时,i会被转换为无符号,然后再和j做比较。此时if成立

1.2 符号转换和类型提升

C语言标准规定,类型不同且符号不同的整型转换时,如果涉及类型提升,先做提升,再做符号转换

点击查看代码
short i = -8;
unsigned int j = i; //0xfffffff8
short提升到int时,先做了符号扩展,即将最高位复制到多出来的位(还有一种零扩展,即将多出来的位全部置为0),然后再做符号转换

2.溢出

每种整数类型都有一个表示范围,例如char的范围是-128~127。存储超出范围的值时,发生溢出
溢出在符号和无符号上表现不同

2.1 无符号

在无符号上,当要存储的值不在表示范围内,去除大于最大位数的位,效果类似于:
1
w表示整型的位数

点击查看代码
unsigned char i = 1, j = 256;
unsigned char m = i + j; // m == 1

2.2 有符号

有符号存在上溢出和下溢出,两种溢出都是去除大于最大位数的位

2.2.1上溢出

2
出现这个现象,是因为上溢出时,去除开头的0,下一位1以负权参与计算

点击查看代码
char i = 1 + 128;  // i == -127; 0 1000 0001,取后八位:1000 0001

3

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

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

posted @ 2026-09-18 22:51  一条指令  阅读(5)  评论(0)    收藏  举报