Domanda

Sto progettando un linguaggio, e cercando di decidere se true dovrebbe essere 0x01 o 0xFF. Ovviamente, tutti i valori diversi da zero verranno convertiti in vero, ma sto cercando di decidere sulla rappresentazione interna esatto.

Quali sono i pro ei contro per ogni scelta?

È stato utile?

Soluzione

0 è falso perché il processore ha una bandiera che è impostato quando un registro è impostato a zero.

Non ci sono altri flag sono impostati su qualsiasi altro valore (0x01, 0xFF, ecc.) - ma la bandiera a zero è impostato su false quando c'è un valore diverso da zero nel registro

Quindi, le risposte qui sostenendo che definisce 0 come falso e quant'altro come vero sono corrette.

Se si vuole "definire" un valore predefinito per una vera, allora 0x01 è meglio di più:

  • Rappresenta lo stesso numero in ogni lunghezza di bit e signedness
  • Si richiede solo di test un po 'se si vuole sapere se è vero, deve la bandiera a zero non essere disponibile o troppo costosi da usare
  • Non c'è bisogno di preoccuparsi di estensione del segno durante la conversione ad altri tipi
  • espressioni logiche e aritmetiche agiscono allo stesso su di esso

-Adam

Altri suggerimenti

Non importa, purché soddisfi le regole per la rappresentanza esterna.

Vorrei prendere un suggerimento da C qui, dove è definita falsa assolutamente come 0, e vero è definito come non falsa. Questa è una distinzione importante, rispetto a un valore assoluto per la vera. A meno che non si dispone di un tipo che ha solo due stati, si deve tenere conto di tutti i valori all'interno di quel tipo di valore, ciò che è vero e ciò che è falso.

Perché sceglie che i valori diversi da zero sono veri? In Ada vero è vero e falso è falso. Non v'è alcun tipo di conversione implicita da e booleane.

Utilizzando -1 ha un vantaggio in un linguaggio debolmente tipizzato - se sbagli e utilizzare l'operatore bit a bit and anziché l'operatore and logica, la sua condizione sarà ancora valutare correttamente fino a quando uno degli operandi è stato convertito a la rappresentazione canonica booleano. Questo non è vero se la rappresentazione canonica è 1.

  0xffffffff & 0x00000010 == 0x00000010 (true)
  0xffffffff && 0x00000010 == 0xffffffff (true)

ma

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)

IMO, se si vuole attaccare con false = 0x00, è necessario utilizzare 0x01. 0xFF di solito è:

  • un segno che qualche operazione traboccato

o

  • un indicatore di errore

E in entrambi i casi, probabilmente significa false . Da qui l'* nix ritorno valore convenzione da eseguibili, che true = 0x00 e ogni valore diverso da zero è falso.

-1 è più digitare di 1 ...

Alla fine non importa dato che 0 è falso e qualsiasi altra cosa è vera, e non sarà mai confrontare l'esatta rappresentazione del vero.

Modifica, per quelli verso il basso la votazione, si prega di spiegare perché. Questa risposta è essenzialmente lo stesso di quello attualmente valutato a +19. In modo che sia 21 voti differenza di ciò che è la stessa risposta di base.

Se è a causa del commento -1, è vero, la persona che definisce in realtà "vera" (ad esempio: l'autore del compilatore) è costretta a usare -1 al posto di 1, supponendo che hanno scelto di utilizzare un rappresentazione esatta. -1 sta andando a prendere più digitare di 1, ed il risultato finale sarà lo stesso. La dichiarazione è stupido, è stata pensata per essere sciocco, perché non v'è alcuna reale differenza tra i due (1 o -1).

Se avete intenzione di marcare qualcosa verso il basso almeno fornire una spiegazione razionale per esso.

0xff è una scelta strana dal momento che ha un presupposto implicito che 8 bit è l'unità minima di conservazione. Ma non è così raro a voler memorizzare i valori booleani più compatto di quello.

Forse si vuole riformulare pensando se gli operatori booleani produrre qualcosa che è solo uno 0 o 1 bit (che funziona indipendentemente dalla estensione del segno), o è tutto zeri o tutti-quelli (e dipende segno estensione del sottoscritto quantità in complemento a due per mantenere tutti-quelli di qualsiasi lunghezza).

Credo che la tua vita è più semplice con 0 e 1.

I pro sono nessuno, e i contro sono, anche. Finché si fornisce una conversione automatica da intero a booleano, sarà arbitrario, in modo che davvero non importa quali numeri si sceglie.

D'altra parte, se non permettere che questo conversione automatica si avrebbe un professionista: non avreste qualche regola del tutto arbitrario nella tua lingua. Non avresti (7 - 4 - 3) == false, o 3 * 4 + 17 == "Hello" o "Hi mom!" == Complex(7, -2).

Credo che il metodo di C è la strada da percorrere. 0 significa falso, qualsiasi altra cosa significa vero. Se si va con un altro mappatura per vero, allora si sono lasciati con il problema di avere valori indeterminati -. Che non sono né vere né false

Se questa è la lingua che ti verrà eseguendo la compilazione di un set di istruzioni specifico che ha un supporto speciale per una particolare rappresentazione, poi ti avrei lasciato che guida voi. Ma in assenza di ulteriori informazioni, per una rappresentazione interna 'standard', mi piacerebbe andare con -1 (tutti 1 di in binario). Questo valore si estende ben a qualsiasi booleano dimensioni desiderate (singolo bit, 8-bit, 16, etc), e se si rompe un "vero" o "falso" in un più piccolo "TRUE" o "FALSE", la sua ancora lo stesso. (Dove se si ha rotto un 16 bit = TRUE 0x0001 otterreste uno FALSE = 0x00 e un vero = 0x01).

Progettare la lingua in modo che 0 è falso e diverso da zero è vero. Non c'è bisogno di "convertire" qualsiasi cosa, e pensare "non-zero" al posto di qualche valore specifico vi aiuterà a scrivere il codice in modo corretto.

Se si dispone di simboli built-in come "True" poi andare avanti e scegliere un valore, ma penso sempre "diverso da zero è vero" al posto di "0x01 è vero".

Qualunque cosa tu faccia, una volta che si seleziona i valori non cambiano loro. A Forth-77, vero e falso sono stati definiti come 1 e 0. Allora, FORTH-83 li ridefinita come -1 e 0. ci fosse un non poco (bene ok, solo pochi, questo è AVANTI stiamo parlando di problemi) causato da questa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top