Nous travaillons donc sur un exercice pour Uni et nous ne pouvons pas comprendre pourquoi ce code génère la deuxième valeur comme -1 Nous pensons que cela est dû à la limite de 16 bits mais ne comprenons pas exactement pourquoi et ne pouvons pas trouver aucune source sur cette question car nous ne savons pas ce que c'est réellement. Je suis désolé si cela semble vraiment stupide, veuillez aider D:

#include <stdio.h>
#include <stdint.h>

int main() {
  int16_t y = 1024, z = 65; // auch "short" als Datentyp verwendbar

  y = y * z;
  printf("1. Ausgabe: %d\n", y);
  printf("2. Ausgabe: %d\n", y / 3 * 3 - 3 * y / 3);
  printf("\n");

  return 0;
}

Nous nous attendions à ce que le résultat soit 0 pour 2. Ausgabe, mais il génère -1

c
-2
Timothy Lee Wietzke 4 nov. 2019 à 13:58

2 réponses

La plage pour un int16_t est −32,768 ... 32,767

y * z = 1024 * 65 = 66560 mais sera donc stocké en tant que 66560% 2 ^ 16 = 1024 vous avez donc encore y = 1024 et votre déclaration y = y * z est inutile

y / 3 * 3 = (y / 3) * 3 = 341 * 3 = 1023! = y en raison de l'arrondissement

3 * y / 3 = (3 * y) / 3 = y car il n'y a pas d'arrondi

Lorsque vous soustrayez, vous obtenez -1

Le problème est que vous débordez votre variable et faites des divisions entières

Utilisez des flotteurs au lieu de int16_t

1
Wheatley 4 nov. 2019 à 11:12

int16_t a la plage [−32768, +32767] - vous débordez cette plage immédiatement avec la première multiplication.

Qu'imprime le premier printf? Cela aurait dû être une indication. Vous en parlez également dans votre question.

Google int16_t range et il vous montrera la plage ci-dessus. Essayez d'utiliser un int32_t et voyez quelle différence cela fait.

0
Salgar 4 nov. 2019 à 11:04