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?

  1. AArm is big-endian, dus de bytes worden in omgekeerde volgorde gelezen
  2. 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
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. Wat is de uitvoer als de bovenstaande code, met b++ aan de rechterkant van && en ||, wordt uitgevoerd?
  2. Wat is de uitvoer als het bovenstaande switch-statement, met een case zonder break, wordt uitgevoerd?
  3. Wat is de uitvoer als het bovenstaande programma wordt uitgevoerd?
  4. Wat is de retourwaarde van de derde aanroep als de bovenstaande functie f drie keer achter elkaar wordt aangeroepen?
  5. Welke combinatie van de levensduur van (1) een lokale variabele die binnen een functie zonder static is gedeclareerd, (2) een met malloc gereserveerd gebied en (3) een variabele die buiten elke functie is gedeclareerd, is in C juist?