Affectation simple avec une mauvaise valeur

private static void convert(int x) { // assume we've passed in x=640. final int y = (x + 64 + 127) & (~127); // as expected, y = 768 final int c = y; // c is now 320?! } 

Y a-t-il des explications saines pour savoir pourquoi le code ci-dessus produirait les valeurs ci-dessus? Cette méthode s'appelle depuis JNI. Le x qui est transmis est à l'origine un type C ++ int qui est static_cast à un jint comme tel: static_cast<jint>(x);

Dans le débogueur, avec le point de rupture défini sur l'affectation y, je vois x = 640. En parcourant une ligne, je vois y = 768. Passer une autre ligne et c = 320. À l'aide du débogueur, je peux définir la variable c = y et l'attribuer correctement 768.

  • Comment vérifier que les données POST sont envoyées depuis une application Android avec la signature SHA1 correcte?
  • OnCreateOptionsMenu () appelant super
  • Focus next textview automatiquement
  • Comment puis-je ajouter un bouton à la fenêtre d'information d'un marqueur?
  • Collage de texte sur un nouvel émulateur Android
  • RemoveCallbacks ne s'arrête pas exécutable
  • Ce code est simple thread et s'exécute plusieurs fois par seconde et le même résultat est toujours observé.

    Mise à jour des commentaires ci-dessous

    Ce problème est maintenant complètement disparu après une journée de débogage. Je le blâmerais sur les rayons cosmiques si cela ne se produisait pas de manière reproductible pendant une journée entière. La chose la plus étrange que j'ai vue depuis très longtemps.

    Je laisserai cette question ouverte pendant un moment dans le cas où quelqu'un aurait une idée de ce qui pourrait causer cela.

  • Clavier numérique numérique sur Android
  • Obtenez la chaîne de format de date préférée du système Android
  • DatePicker affiche une mauvaise valeur du mois
  • Android - Utilisation de la méthode à partir d'un service dans une activité?
  • Composez le code USSD?
  • Des erreurs étranges lors de l'installation de l'application Android?
  • 3 Solutions collect form web for “Affectation simple avec une mauvaise valeur”

    Étape 01: compilez-le bien, consultez les commentaires sous votre publication.

    Si nécessaire, avec ce code, il ira: code C #

     private void callConvert(object sender, EventArgs e) { string myString = Convert.ToString(convert123(640)); textBox1.Text = myString; } private static int convert123(int x) { // assume we've passed in x=640. int y = (x + 64 + 127) & (~127); // as expected, y = 768 int c = y; // c is now 320?! return (c); } 

    Mais son code ac #

    Et un tipp pour vous NE LISEZ JAMAIS votre funktion avec un nom qui est utilisé dans le compilateur en tant que standart. Convert est dans la plupart des langues utilisées.

     (system.convert) 

    Avez-vous défini c à 320 récemment? Si c'est le cas, il a peut-être été stocké dans une mémoire et le compilateur peut l'avoir réaffecté à ce qu'il pensait être et non ce qu'il devait être. Je suis, en partie, deviner.

    Il ressemble à un problème de taille d'octet de mémoire des variables temporaires si le programme est optimisé pour l'utilisation de la mémoire. Le débogueur peut ne pas être fiable. Je vois si le temporaire ~ 127 est stocké dans un octet, alors vous pouvez atteindre le scénario que vous avez observé. Tout dépend de ce que le ~ 127 est stocké au moment de l'exécution.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.