Dans le cadre d'un casse-tête, je suis invité à implémenter une fonction qui vérifie si deux entrées peuvent être additionnées sans débordement. Opérations légales:! ~ &^| + < < >>.Comportement bizarre de & operator dans C
Par exemple, pour x = 0x80000000 et y = 0x80000000 la fonction doit retourner 0 car il déborde, mais pour x = 0x80000000 et y = 0x70000000 le résultat serait 1.
Ma solution à ce jour est la suivante:
int addOK(int x, int y) {
int mask = ~(1 << 31); // 0x7fffffff
int newX = (mask & (x >> 1)); // Shift 1 to the right to make space for overflow bit
int newY = (mask & (y >> 1));
int add = newX + newY; // Add shifted x and y - overflow bit will be the MSB
int res = (add & ~mask); // Set all bits to 0 except MSB - MSB 1 iff overflow 0 otherwise
int endRes = !res; // 0x80000000 -> 0x00000000, 0x00000000 -> 0x00000001
printf("mask %x newX %x newY %x add %x ~mask %x res %x endRes %x\n",mask, newX, newY, add, ~mask, res, endRes);
return endRes;
}
la fonction imprime les éléments suivants pour x = 0x80000000 et y = 0x80000000:
mask 7fffffff newX 40000000 newY 40000000 add 80000000 ~mask 80000000 res 0 endRes 1
maintenant, ma question est pourquoi est-res
0? il devrait être 0x80000000 parce que add
et ~mask
sont 0x80000000. Quelqu'un peut-il m'expliquer ce comportement?
Impossible de reproduire: http://ideone.com/an8ocK – clcto
Vous savez passer dans le bit de signe [est mauvais] (http://stackoverflow.com/questions/4009885/arithmetic-bit-shift-on-a -signed-integer), n'est-ce pas? Est-ce que vous n'utilisez pas simplement INT_MAX plutôt que d'essayer de le faire vous-même? – WhozCraig
Ok merci; cela est étrange. Je ne suis pas censé utiliser des constantes plus grandes qu'un octet pour cette tâche. – user3273046