欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]c语言中变量比较规则

[原创]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. 低层次与高层次类型做比较时,低层次的先同符号扩展为与高层次同级的类型,然后再根据高层次类型有无符号,做相应的有无符号比较。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功