Проверьте, является ли ввод наибольшим целым числом дополнения 2 - PullRequest
0 голосов
/ 27 марта 2020
/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */
int isTmax (int x) 
{
    int t = x + 1;
    return !(t + t) ^ !t;
}  

Если x является наибольшим номером дополнения 2, то 2*t переполняется до 0, но также равно 0, если x равно -1, поэтому мы присваиваем ему значение !t, которое оценивается в 1. Так что мы должны получить 1, но как-то на выходе будет 0.

Ответы [ 3 ]

2 голосов
/ 27 марта 2020

Этот код в корне неверен. Переполнение со знаком является неопределенным поведением и не гарантирует какой-либо формы детерминированного c результата.

Чтобы проверить, является ли число "наибольшим из возможных", вам лучше сравнить его с INT_MAX из limit.h , Или, если хотите, сравните его с (int) ((1u<<31)-1).

0 голосов
/ 28 марта 2020

Если разрешены константы, вы можете сделать

int isTmax (int x) 
{
   return !(((unsigned) x) ^ 0x7fffffff);
}

В противном случае вы можете сделать

int isTmax (int x) 
{
unsigned nx = ~(unsigned) x;
unsigned r = !(nx + nx) ^ !nx;
}
0 голосов
/ 28 марта 2020
int isTmax (int x) {
    return !(~(x + x + 1) | !(~x));
}

Это работает так, как (x + x + 1) становится -1, если x равен INT_MAX, и все, что осталось, это проверить, не равен ли x -1.

...