无符号和有符号的条件码区别

176 阅读1分钟

uint.c:

#include <stdio.h>
int main()
{
  unsigned int a = 1<<31;
  unsigned int b = 0;
  printf("%d\n",(int)(a>b));
  return 0;
}

这个执行结果是1

int.c

#include <stdio.h>
int main()
{
  int a = 1<<31;
  int b = 0;
  printf("%d\n",(int)(a>b));
  return 0;
}

这个执行结果是0

我们去看一下他们的区别吧,左边是unit的,右边是intimage.png 可以看到,uint的是seta(above),int的是setg(greater),因为seta是无符号的set,setg是有符号的set。

可以看到,前面用cmp去得到四个条件码,然后在seta和setg分别去得到这个cmp的结果:

  • seta(无符号):CF = 0 and ZF = 0,即无符号的>0且结果不为0时,设置为1
  • setg(有符号):SF = OF and ZF = 0,即有符号的结果>0且结果不为0,设置为1