Puis-je stocker 4294967295 in unsigned int? Int est 4 octets sur ma machine

Pourquoi est-ce que je reçois 0 ?? Et avertissement du compilateur:

le format ‘% d’ attend un argument de type ‘int‘, mais l’argument 3 a le type ‘long unsigned int’

Voici le code:

#include  //function declerations... int power(int base, int on); int main(void) { printf("%d",power(2, sizeof(int)*8)-1); return 0; } int power(int base, int on) { int pf = 1; for (int i = 0; i < on; i++) { pf *= base; } return pf; } 

Si int est 4 octets sur mon système, je suppose que je devrais pouvoir stocker 4294967295 dans unsigned int.

Si votre int ou unsigned int est de 32 bits, aucun des deux ne peut stocker la valeur 4294967296 puisqu’il s’agit de 2**32 ce qui nécessiterait un type 64 bits.

Même uint32_t ne peut stocker que la valeur maximale 2**32 - 1 , votre valeur est donc juste 1 hors limites.

Mais int32_t peut stocker la valeur positive maximale 2**31 - 1 afin que le type signé soit encore plus éloigné.

En supposant qu’un int ait 4 octets et que vous ayez 8 octets, alors int largeur de 32 bits. Par la suite, un signed int (si les négatifs sont représentés par un complément à 2) a une plage de -2147483648 à 2147483647 et un unsigned int a une plage de 0 à 4294967295.

La valeur binary 4294967296 est 1 00000000 00000000 00000000 00000000 . C’est 33 bits. Donc 4294967296 est trop gros pour ce type.

Je suis de retour après longtemps (évidemment) sur cette question, et je ne suis pas sûr de comprendre pourquoi tout le monde pense qu’OP voulait stocker 4294967296 alors qu’il voulait stocker 4294967295 comme demandé dans la question, peut-être qu’OP a changé la question plus tard, et personne ne s’est donné la peine de le faire. re-répondre. Maintenant, revenons à la question.

Vous pouvez stocker 4294967295 dans unsigned int , mais le problème réside dans votre impression. Vous printf("%d", 4294967295) ce qui signifie que vous imprimez 4294967295 tant 4294967295 signed int , mais le numéro 4294967295 ne peut pas être stocké dans signed int . la conversion se rétrécit.

Vous devez imprimer l’ unsigned int que vous avez avec %u plutôt que %d .

 #include  int power(int base, int pow); int main(){ printf("Size of unsigned int: %d\n", sizeof(unsigned int)); unsigned int the_number = power(2, sizeof(int)*8)-1; printf("Wrongly printed: %d\n", the_number); printf("Correctly printed: %u\n", the_number); return 0; } int power(int base, int on) { int pf = 1; for (int i = 0; i < on; i++) { pf *= base; } return pf; }