首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言中俩数值的比较是否补码的比较

2013-01-18 
C语言中俩数值的比较是不是补码的比较C语言中俩数值的比较是不是补码的比较,void foo(void){unsigned int

C语言中俩数值的比较是不是补码的比较
C语言中俩数值的比较是不是补码的比较,
void foo(void)
{
  unsigned int a = 6 ;
  int b = -20 ;
  (a+b>6)?puts(">6"):puts("<=6");
}
输出结果为:>6
为什么a+b的值是-14,为什么比6大?
是转换为补码后比较的吗,具体怎样比的呢?
[解决办法]
一个是int(有符号位) ,unsigned  int(无符号位),在做运算的时候,会把有符号位的转换成unsigned int 的,所以,你的a+b=-20,这个时候-20要转换成unsigned int ,取-20的补码和6做比较,当然是大于6的!
[解决办法]
那为啥printf("%d",a+b); 结果会是 -14呢,求解答!!
[解决办法]

引用:
那为啥printf("%d",a+b); 结果会是 -14呢,求解答!!

%d是有符号整形,%ud是无符号整形
[解决办法]
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

参考汇编指令
    CMP     比较.(两操作数作减法,仅修改标志位,不回送结果).
    JA/JNBE     不小于或不等于时转移.
    JAE/JNB     大于或等于转移.
    JB/JNAE     小于转移.
    JBE/JNA     小于或等于转移.
        以上四条,测试无符号整数运算的结果(标志C和Z).
    JG/JNLE     大于转移.
    JGE/JNL     大于或等于转移.
    JL/JNGE     小于转移.
    JLE/JNG     小于或等于转移.
        以上四条,测试带符号整数运算的结果(标志S,O和Z).
    JE/JZ       等于转移.
    JNE/JNZ     不等于时转移.
    JC          有进位时转移.
    JNC         无进位时转移.
    JNO         不溢出时转移.
    JNP/JPO     奇偶性为奇数时转移.
    JNS         符号位为 "0" 时转移.
    JO          溢出转移.
    JP/JPE      奇偶性为偶数时转移.
    JS          符号位为 "1" 时转移.

热点排行