Vergelijking tussen aanwijzer en integer in C op X86 versus ARM

in mijn programma vergelijk ik char tegen hexadecimale int en krijg ik verschillende resultaten voor draait in X86 PC en ARM handheld, gecompileerd met arm-gcc of native gcc op n900, hoe dan ook, voorwaarde is waar voor pc en niet doorgeven op mobiel.

int main(int argc, char *argv[])
{
      if (*argv[1] == 0xffffffcc)
          puts("ok");

      return 0;
}
1
Op welk karakter probeer je eigenlijk te testen? Latijnse hoofdletter I met graf of het begin van een utf-8-reeks?
toegevoegd de auteur CB Bailey, de bron
Waar in deze vraag vergelijk je een pointer en een integer?
toegevoegd de auteur MikeMB, de bron
op beide bogen ben ik bezig: ./ a.out $ (printf "0xcc" | xxd -r)
toegevoegd de auteur Dr. KingSchultz, de bron

2 antwoord

Op ARM-systemen is char type meestal standaard niet ondertekend terwijl het op x86 meestal is ondertekend. De gelijkheidsoperator == voert gehele-prijspromoties uit van beide operanden, dus het verschil van het gedrag wanneer * argv [1] wordt beschouwd als ondertekend (tekenuitbreiding wordt uitgevoerd) of niet ondertekend (er wordt geen tekenuitbreiding uitgevoerd).

Met gcc merk op dat je de standaard van type char kunt veranderen met de opties -fsigned-char en -funsigned-char code>.

5
toegevoegd

Het is waarschijnlijk verstandiger om te vergelijken met een acutale karakterconstante. Hoewel geheeltallige promoties nog steeds voorkomen bij beide operanden van == , zullen ze op zijn minst op dezelfde manier gebeuren en zult u niet afhankelijk zijn van de ondertekening van uw char van de grootte van uw int of unsigned int .

Bijv.

if (*argv[1] == '\xcc')

Ik geloof dat het gebruikelijk is dat ARM-compilers char ongesigneerd maken, wat betekent dat wanneer '\ xcc' wordt gepromoveerd tot een geheel getal, u de waarde 0xcc , niet 0xffffffcc .

5
toegevoegd
@randomonkey, Overweeg een antwoord op je vraag te accepteren. Ik heb je profiel bekeken: het lijkt erop dat je altijd een antwoord hebt gekregen en je hebt er geen enkele van geaccepteerd, alleen gezegd dat het goed was.
toegevoegd de auteur Zagorax, de bron
@randomonkey: waarom is dat grappig?
toegevoegd de auteur CB Bailey, de bron
: D gek ding, het werkt!
toegevoegd de auteur Dr. KingSchultz, de bron
Ik heb lol gehad met gcc ...
toegevoegd de auteur Dr. KingSchultz, de bron
@Zagorax, ach ik heb net ontdekt dat ik 'quiestions' kan accepteren, txs!
toegevoegd de auteur Dr. KingSchultz, de bron