39 votes

Question D'Entrevue

J'ai posé la sortie de le code suivant dans mon interview d'hier

#include <stdio.h>
int main(void){
       printf ("%x" ,-1<<4); 
}

On m'a donné 2 minutes pour dire la réponse. J'ai répondu fffffff0. Le résultat de l'entrevue n'a pas été encore déclarée. Je veux savoir ma réponse correcte?

58voto

Prasoon Saurav Points 47488

Techniquement gauche-déplacer un entier négatif invoque un Comportement indéterminé. Cela signifie que -1<<4 UB. Je ne sais pas pourquoi on vous a demandé cette question. Probablement, ils voulaient tester vos connaissances du C et C++ Normes.

C99 [6.5.7/4] dit

Le résultat de E1 << E2 E1 gauche décalée E2 positions de bits; vacant bits sont remplis de zéros. Si E1 est un type non signé, la valeur du résultat est E1× 2E2, la réduction modulo un de plus que la valeur maximale représentable dans le type de résultat. Si E1 a signé type et non négatif de la valeur, et E1× 2E2 est représentable dans le type de résultat, alors que c'est la valeur qui en résulte; sinon, le comportement est indéfini.

C++03 rend comportement indéfini en omettant le texte pertinent.

11voto

Crazy Eddie Points 23778

Pas de. Vous n'êtes pas correct. C'est la mauvaise nouvelle. La bonne nouvelle, c'est que l'enquêteur n'a probablement pas savoir qui et supposerons que vous êtes car c'est le résultat qu'ILS obtiennent quand ils compiler et l'exécuter.

La vraie réponse est qu'elle est définie par l'implémentation. Je ne suis pas à 100% confiant pour dire que c'EST un comportement indéfini en raison de la surcharge de travail, mais je pense qu'il peut être. À tout le moins si le résultat est dépendant de la façon dont les nombres négatifs sont représentés, etc... Ni la langue que vous avez demandé c'est de définir ce que la sortie sera.

9voto

cdhowie Points 62253

Sur ma machine:

chris@zack:~$ cat > test.c
#include <stdio.h>
int main(void){
       printf ("%x" ,-1<<4);
}

chris@zack:~$ gcc -o test test.c && ./test
fffffff0

Cependant, le résultat dépendra de votre architecture et du compilateur. Donc la bonne réponse est "il a pu produire quoi que ce soit."

8voto

mr_eclair Points 9503
Binary of 1  : 0000 0000 0000 0000 0000 0000 0000 00001

Remplacer l'apparition de 0 à 1, comme vous allez calculer binaire de négatif pas d'

Comment calculer binaire des nombres négatifs

Binary of -1 : 1111 1111 1111 1111 1111 1111 1111 11111

Left shift 4 : 1111 1111 1111 1111 1111 1111 1111 0000

Représentation hexadécimale de la résultante de décalage à Gauche 4 sera

1111 : F 

0000 : 0

ainsi calculé sortie sera :

FFFFFFF0

Votre réponse est juste.

3voto

semaj Points 1018

Gauche la vitesse d'un nombre négatif n'est pas défini pour le général de cas, mais nous devons comprendre pourquoi ce comportement indéfini (UB)? Gardez à l'esprit que le Bit de poids fort (MSb) est le bit de signe. Si ce bit est à 1, le nombre est négatif. Si c'est un zéro le nombre est positif. C'est l'essentiel de l'information est perdue avec le premier virage à gauche. Par exemple

-32768<<4

c'est la même chose que

0x8000<<4

(en supposant que les 16 bits de la machine pour des raisons de simplicité)

Le résultat est, bien sûr, de 0 qui n'a pas vraiment de sens et est donc UB.

Dans le cas spécifique de la question de l'entrevue de l'OP, il y a seulement une valeur spécifique qui nous concerne...pas le cas général. -1 (0xffffffff sur un ordinateur 32 bits) décalé à gauche 4 fois donnera 0xfffffff0 que l'OP à l'origine de la pensée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X