First of all, we specify that we assume:
- 2
int 32 , long long - 64 .- -
(~x+1) , -x. , INT_MIN INT_MAX, , x INT_MIN, (~x+1) INT_MIN -INT_MIN, .
y+(-x) ( ).
, , int, , long long , , 64- , (~x+1) -x y+(-x) . , , >>31 >>63.
:
static bool isGreater(int x, int y) {
long long llx = x;
long long lly = y;
long long result = ((lly+(~llx+1))>>63)&1;
return result;
}
, x == INT_MIN, x == 0 x == INT_MAX:
int main(void) {
int x = INT_MIN;
for (long long y = INT_MIN; y <= INT_MAX; ++y) {
assert(isGreater(x, y) == (x > y));
}
x = INT_MAX;
for (long long y = INT_MIN; y <= INT_MAX; ++y) {
assert(isGreater(x, y) == (x > y));
}
x = 0;
for (long long y = INT_MIN; y <= INT_MAX; ++y) {
assert(isGreater(x, y) == (x > y));
}
}
. 163 .
, , int ( long long int).
, int32_t int64_t int long long . :
ISO/IEC 9899: 2011 §6.5.7
5 E1 → E2 - E2 E1. E1 , E1 , E1/2E2. E1 , .