我有这个简单的 C 程序。
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
bool foo (unsigned int a) {
return (a > -2L);
}
bool bar (unsigned long a) {
return (a > -2L);
}
int main() {
printf("foo returned = %d\n", foo(99));
printf("bar returned = %d\n", bar(99));
return 0;
}
当我运行它时输出 -
foo returned = 1
bar returned = 0
在Godbolt 中重新创建
我的问题是为什么foo(99)
返回 true 但bar(99)
返回 false。
bar
对我来说,返回 false是有道理的。为简单起见,假设 long 是 8 位,然后(使用二进制补码作为有符号值):
99 == 0110 0011
-2 == unsigned 254 == 1111 1110
所以很明显 CMP 指令会看到 1111 1110 更大并返回 false。
但我不明白函数的幕后发生了什么foo
。的程序集foo
似乎硬编码为总是 return mov eax,0x1
。我本来希望foo
做类似的事情bar
。这里发生了什么?