13

私は言語を設計しており、true0x01 か 0xFF かを決定しようとしています。明らかに、ゼロ以外の値はすべて true に変換されますが、正確な内部表現を決定しようとしています。

それぞれの選択の長所と短所は何ですか?

4

11 に答える 11

29

外部表現のルールを満たしている限り、問題ではありません。

ここでCからヒントを得ます。ここで、falseは絶対に0として定義され、trueはfalseではないと定義されます。これは、trueの絶対値と比較した場合の重要な違いです。2つの状態しかない型がない限り、その値型内のすべての値、真、および偽を考慮する必要があります。

于 2009-04-07T19:17:03.227 に答える
11

ゼロ以外の値が真であることを選択するのはなぜですか?Adaでは、trueはTRUEであり、falseはFALSEです。BOOLEANとの間の暗黙的な型変換はありません。

于 2009-04-07T19:23:19.980 に答える
11

and-1 を使用すると、弱く型付けされた言語で 1 つの利点があります。論理演算子の代わりにビットごとの演算子を台無しにして使用した場合andでも、オペランドの 1 つが正規のブール表現に変換されている限り、条件は正しく評価されます。正規表現が 1 の場合、これは当てはまりません。

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

しかし

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)
于 2009-04-07T19:33:04.060 に答える
5

IMO、false = 0x00を維持したい場合は、0x01を使用する必要があります。0xFFは通常次のとおりです。

  • 一部の操作がオーバーフローした兆候

また

  • エラーマーカー

そしてどちらの場合も、それはおそらくを意味します。したがって、実行可能ファイルからの* nix戻り値の規則、つまりtrue = 0x00であり、ゼロ以外の値はすべてfalseです。

于 2009-04-07T19:18:45.920 に答える
4

-1は1よりも長く入力します。..

結局、0は偽であり、他の何かが真であるため、それは問題ではありません。真の正確な表現と比較することは決してありません。

編集、反対票の方は、その理由を説明してください。この答えは、現在+19と評価されているものと本質的に同じです。つまり、同じ基本的な答えとは21票の差です。

-1のコメントが原因である場合、それは真実です。実際に「真」を定義する人(たとえば、コンパイラーの作成者)は、正確な表現を使用することを選択した場合、1ではなく-1を使用する必要があります。-1は1よりも入力に時間がかかり、最終結果は同じになります。このステートメントはばかげています。2つ(1または-1)の間に実際の違いがないため、ばかげていることを意味していました。

何かをマークダウンする場合は、少なくともその理由を説明してください。

于 2009-04-07T19:19:24.763 に答える
3

0xffは、8ビットが最小ストレージ単位であるという暗黙の仮定があるため、奇妙な選択です。しかし、ブール値をそれよりもコンパクトに格納したいのは珍しいことではありません。

おそらく、ブール演算子が1つの0ビットまたは1ビット(符号拡張に関係なく機能する)であるか、すべてゼロまたはすべて1である(そして符号付き2の補数の符号拡張に依存する)ものを生成するかどうかを考えて言い換えたいと思います。任意の長さですべてを維持するための量)。

あなたの人生は0と1でもっとシンプルだと思います。

于 2009-04-07T19:21:51.683 に答える
3

長所はありませんし、短所もありません。整数からブール値への自動変換を提供する限り、それは任意であるため、どの数値を選択しても問題ありません。

一方、この自動変換を許可しない場合は、長所があります。言語に完全に恣意的なルールはありません。、、、(7 - 4 - 3) == falseまたははありません。3 * 4 + 17 == "Hello""Hi mom!" == Complex(7, -2)

于 2009-04-07T20:29:15.377 に答える
2

私はCメソッドが進むべき道だと思います。0 は false を意味し、それ以外は true を意味します。true に別のマッピングを使用すると、不確定な値 (true でも false でもない) を持つという問題が残ります。

これが、特定の表現を特別にサポートする特定の命令セット用にコンパイルする言語である場合は、それを参考にしてください。しかし、追加情報がない場合、「標準」の内部表現では、-1 (バイナリですべて 1) を使用します。この値は、任意のサイズのブール値 (1 ビット、8 ビット、16 など) に拡張され、「TRUE」または「FALSE」をより小さな「TRUE」または「FALSE」に分割しても、同じ。(16 ビットの TRUE=0x0001 を壊すと、FALSE=0x00 と TRUE=0x01 になります)。

于 2009-04-07T19:27:23.480 に答える
1

0が偽で、ゼロ以外が真になるように言語を設計します。何かを「変換」する必要はありません。特定の値の代わりに「ゼロ以外」を考えると、コードを正しく記述するのに役立ちます。

「True」のような組み込みシンボルがある場合は、先に進んで値を選択しますが、常に「0x01がtrue」ではなく「非ゼロがtrue」であると考えてください。

于 2009-04-07T19:47:15.167 に答える
1

何をするにしても、一度選択した値は変更しないでください。FORTH-77 では、true と false は 1 と 0 として定義されていました。その後、FORTH-83 はそれらを -1 と 0 として再定義しました。問題は少なからずありました (まあ、ごくわずかです。これは私たちが話している FORTH です)。これによって引き起こされます。

于 2009-04-07T20:33:27.287 に答える