NSUInteger ne remplit pas son rôle ?

muqaddarmuqaddar Administrateur
mars 2011 modifié dans Objective-C, Swift, C, C++ #1
Je suis tombé sur quelque chose qui me dépasse.

NSUInteger _unplaced = 2;<br />NSInteger diff = -4;<br /><br />_unplaced += diff;<br /><br />NSLog(@&quot;_unplaced: %d&quot;, _unplaced);


[86300:207] _unplaced:  -1


_unplaced était non signé, comment peut-il m'afficher une valeur négative ?

Y'a moyen de contourner le problème avec 2 ou 3 if, mais vu que diff peut être positif ou négatif, je pensais que _unplaced se contenterait de se mettre à  0, si on lui envoyait une valeur négative qui le fait descendre en dessous de 0.

Le pire, c'est que si je mets ensuite :

if (_unplaced &lt; 0) ...


il me met bien sûr un warning me disant que c'est impossible qu'il soit infèrieur à  0 vu qu'il est unsigned ! Ce qui est logique.

Réponses

  • zoczoc Membre
    mars 2011 modifié #2
    dans 1301469599:

    Je suis tombé sur quelque chose qui me dépasse.

    NSUInteger _unplaced = 2;<br />NSInteger diff = -4;<br /><br />_unplaced += diff;<br /><br />NSLog(@&quot;_unplaced: %d&quot;, _unplaced);
    


    [86300:207] _unplaced:  -1


    _unplaced était non signé, comment peut-il m'afficher une valeur négative ?

    Parce que pour afficher un entier non signé, on n'utilise pas %d, mais %u

    je pensais que _unplaced se contenterait de se mettre à  0, si on lui envoyait une valeur négative qui le fait descendre en dessous de 0.

    Non, ce n'est jamais le cas en C (et par la même occasion en objective-c). Le C est un langage de "bas niveau" et donc aucune vérification de ce type n'est effectuée. Le but du C, c'est de produire du code rapide, pas du code sûr. La sureté du code est laissé au développeur.

    Au niveau du processeur, il n'y a pas vraiment de différence au niveau du stockage d'entiers signé et non signés. par exemple, un entier signé sur 16 bits de valeur -1 est stocké comme un entier non signé de valeur hexa 0xFFFF.

    Par contre je suis surpris que tu n'aies pas de warning sur le "+=". Peut-être qu'en compilant avec tous les warnings activés... (option -Wall de GCC).
  • muqaddarmuqaddar Administrateur
    19:13 modifié #3
    dans 1301470016:

    Parce que pour afficher un entier non signé, on n'utilise pas %d, mais %u


    Oups, j'utilise tellement peu les entiers signés que j'avais oublié !

    Non, ce n'est jamais le cas en C (et par la même occasion en objective-c). Le C est un langage de "bas niveau" et donc aucune vérification de ce type n'est effectuée. Le but du C, c'est de produire du code rapide, pas du code sûr. La sureté du code est laissé au développeur.


    Alors, je vais m'appliquer à  faire une moulinette pour rendre le code sûr.

    Par contre je suis surpris que tu n'aies pas de warning sur le "+=". Peut-être qu'en compilant avec tous les warnings activés... (option -Wall de GCC)


    Parce que diff a une chance d'être positif, et que dans ce cas, ça ne pose pas de problème ?
  • zoczoc Membre
    19:13 modifié #4
    dans 1301470393:

    Parce que diff a une chance d'être positif, et que dans ce cas, ça ne pose pas de problème ?

    Franchement, si le compilateur fait ce genre de supposition, c'est grave...
  • muqaddarmuqaddar Administrateur
    19:13 modifié #5
    dans 1301470731:

    dans 1301470393:

    Parce que diff a une chance d'être positif, et que dans ce cas, ça ne pose pas de problème ?

    Franchement, si le compilateur fait ce genre de supposition, c'est grave...


    En fait, j'utilise LLVM mais il devrait être encore plus intransigeant.
  • cyranocyrano Membre
    19:13 modifié #6
    Je suis tombé sur quelque chose qui me dépasse.

    Code: [Sélectionner]
    NSUInteger _unplaced = 2;
    NSInteger diff = -4;

    _unplaced += diff;

    NSLog(@_unplaced: %d, _unplaced);

    Citation
    [86300:207] _unplaced:  -1


    _unplaced était non signé, comment peut-il m'afficher une valeur négative ?



    Pourtant tu dois maitriser parfaitement le MVC  :D  :D  :D  :D  :D
  • muqaddarmuqaddar Administrateur
    19:13 modifié #7
    dans 1301473041:

    Pourtant tu dois maitriser parfaitement le MVC  :D  :D  :D  :D  :D


    J'ai pas saisi.  ::)
  • cyranocyrano Membre
    19:13 modifié #8
    sorry

    c'est une plaisanterie sur le model (NSUInteger) et la vue ( %d" )

    avec "bcq d'abstraction" on est bien dans le MVC ?
  • 19:13 modifié #9
    Punaise, beaucoup d'abstraction ouaip  :P
  • AliGatorAliGator Membre, Modérateur
    19:13 modifié #10
    Heu j'ai pas saisi non plus le rapport entre MVC et NSUInteger/%d...
  • muqaddarmuqaddar Administrateur
    19:13 modifié #11
    dans 1301495299:

    Heu j'ai pas saisi non plus le rapport entre MVC et NSUInteger/%d...


    C'est parce que c'était capilotracté. :)
  • FKDEVFKDEV Membre
    19:13 modifié #12
    dans 1301471906:

    dans 1301470731:

    dans 1301470393:

    Parce que diff a une chance d'être positif, et que dans ce cas, ça ne pose pas de problème ?

    Franchement, si le compilateur fait ce genre de supposition, c'est grave...


    En fait, j'utilise LLVM mais il devrait être encore plus intransigeant.


    C'est normal de ne pas avoir de warning, on a le droit de faire des soustractions sur un non signé. Je vois pas où est le problème.
    C'est dans les comparaisons signé/non signé que tu dois avoir des warnings.

    Après, sur le code que tu as donné en exemple, un analyseur syntaxique (build and analyze) doit pouvoir te signaler un débordement. Mais je suppose que ce n'était pas le vrai code.

  • cyranocyrano Membre
    19:13 modifié #13
    C'est parce que c'était capilotracté.


    oui oui, hier c'etait pas la forme  >:)
Connectez-vous ou Inscrivez-vous pour répondre.