Il motivo principale per cui vedo che cosa dovrebbe essere una rappresentazione binaria? il proprio complemento? complemento a due? stai aspettando i bit effettivi in memoria o la rappresentazione del numero astratto?
Solo quest'ultimo ha senso quando C non richiede requisiti per la dimensione della parola o la rappresentazione del numero binario. Quindi visto che non sarebbero i bit in memoria, sicuramente preferiresti leggere il numero astratto in hex?
Rivendicazione una rappresentazione astratta è "binario" potrebbe portare alla convinzione che -0b1^0b1 == 0
potrebbe essere vero, o che -0b1 | -0b10 == -0b11
rappresentazioni possibili:
Mentre non v'è solo una rappresentazione esadecimale significativa - - quello astratto, il numero -0x79
può essere rappresentato in binario come:
-1111001
(il numero astratto)
11111001
(complemento a uno)
10000111
(complemento a due)
@Eric mi ha convinto che endianness! = Da sinistra a destra ordine ...
il problema è ulteriormente aggravato quando i numeri non si adattano in un byte. lo stesso numero potrebbe essere:
-
1000000001111001
come complemento per provare le proprie big-endian numero 16bit
-
1111111110000111
come un complemento a due big-endian numero 16bit
-
1000011110000000
come uno di -complementare numero little-endian 16bit
-
1000011111111111
come numero a due bit di little-endian a 16 bit
I concetti di endianità e rappresentazione binaria non si applicano ai numeri esadecimali in quanto non è possibile che possano essere considerati la rappresentazione di bit in memoria effettiva.
Tutti questi esempi presuppongono un byte a 8-bit, che C non fornisce alcuna garanzia di (macchine storiche in effetti ci sono stati con i byte 10 bit)
Perché nessuna decisione è meglio di qualsiasi decisione:
Ovviamente si può scegliere arbitrariamente una rappresentazione o lasciarla definita. Tuttavia:
- se si sta cercando di usare questo per eseguire il debug di bit per bit operazioni, (che io vedo come l'unico motivo valido per usare binario sopra hex) che si desidera utilizzare qualcosa di simile quello che utilizza l'hardware, il che lo rende impossibile da standardizzare, quindi si desidera definire l'implementazione.
- Al contrario, se si sta tentando di leggere una sequenza di bit, è necessario un formato standard, non definito dall'implementazione.
- E sicuramente vuoi che printf e scanf usino lo stesso.
Quindi a me sembra che non ci sia un mezzo felice.
Perché stampare binari se è possibile stampare hex? È fondamentalmente la stessa cosa, ma con una densità del 400%. Basta tradurre, '0 = 0000',' 1 = 0001', '2 = 0010', ...,' F = 1111'. –
@ KerrekSB - Solo perché non è così difficile da fare da soli non è un motivo valido per escluderlo dalla lingua. È difficile passare dalla scrittura a uno stream alla scrittura in un buffer di stringa, tradurre e quindi scrivere su uno stream. –
@TedHopp: una volta si poteva discutere l'altro modo perché sarebbe * necessario * essere necessario. Potresti chiedere che vengano inclusi tutti i tipi di materiale (base-4? Base-64?), Ma alla fine non esiste una risposta giusta o sbagliata. I progettisti probabilmente non pensavano che fosse necessario. Immagino che il fatto che chiunque fosse nel business della manipolazione binaria sarebbe sufficientemente esperto in esadecimale ... –