Basis van programmeren in C
Een programma dat „char c = 200;” instelt en c met %d in printf afdrukt, gaf −56 na compileren en uitvoeren met gcc voor Linux op x86-64, en 200 met gcc voor Linux op Arm. Wat is de reden voor dit verschil?
- AArm is big-endian, dus de bytes worden in omgekeerde volgorde gelezen
- BOf een char zonder signed of unsigned een type met of zonder teken is, bepaalt de implementatie; op x86-64 is het met teken en op Arm zonder teken
- COp x86-64 heeft char 16 bits, en het bovenste bit wordt als teken behandeld
Antwoord en toelichting tonen
Antwoord: B. Of een char zonder signed of unsigned een type met of zonder teken is, bepaalt de implementatie; op x86-64 is het met teken en op Arm zonder teken
Of een char zonder signed of unsigned een type met of zonder teken is, legt de standaard niet vast, maar laat hij over aan de implementatie (door de implementatie bepaald gedrag, implementation-defined). Op Linux op x86-64 is char met teken en kan het alleen −128 tot 127 weergeven, dus het opslaan van 200 geeft 200 − 256 = −56. Op Linux op Arm en RISC-V is char zonder teken en wordt 200 ongewijzigd opgeslagen. Gebruik voor bytegegevens unsigned char of uint8_t, zodat duidelijk is hoe met het teken wordt omgegaan.