[原创]c语言中变量比较规则
0x00 简介
C语言中无符号整形与有符号整形,低层次与高层次类型的比较等等,涉及到默认的一些规则,需要理解清楚。
0x01 实验
1. 无符号整形与有符号整形
unsigned int un_a = 1;
int n_b = -1;
printf("un_a<n_b: %d\n", un_a<n_b);
>> un_a<n_b: 1
有符号整形与无符号整形比较时,按无符号进行比较,所以n_b = -1 => n_b = 0xffffffff > 1
2. 无符号char与有符号char
char c_a = -1;
unsigned char uc_b = -1;
printf("c_a<uc_b: %d\n", c_a<uc_b);
>> c_a<uc_b: 1
char与unsigned char以及short与unsigned short都会先扩展为与其同符号的整形,即char->int,unsigned char->unsigned int等等,然后再做有符号比较。
3. 有符号整形与无符号char
int n_a = 1;
unsigned char uc_b = -1;
printf("n_a<uc_b: %d\n", n_a<uc_b);
>> n_a<uc_b: 1
uc_b先做无符号扩展(movzx)为uint型0xff,然后再做有符号比较,则n_a = 1 < 0xff = (int)((uint)uc_b)
4. 无符号整形与有符号char比较
unsigned int un_a = 1;
char c_b = -1;
printf("un_a<c_b: %d\n", un_a<c_b);
>> u_a<c_b: 1
c_b先做有符号扩展(movsx)为int型0xffffffff,然后再做无符号比较,则un_a = 1 < 0xffffffff = (uint)((int)c_b)
0x02 小结
1. 无符号类型与有符号类型(这里的类型都是不低于整形层次的类型)做比较时,按无符号进行比较;
2. 两个低层次类型(低于整形的同属于低层次)的变量进行比较时,先同符号扩展为高层次的类型,然后再做有符号比较;
3. 低层次与高层次类型做比较时,低层次的先同符号扩展为与高层次同级的类型,然后再根据高层次类型有无符号,做相应的有无符号比较。
