C语言中俩数值的比较是否补码的比较
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呢,求解答!!
[解决办法]
%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" 时转移.