ここから本文です

C言語では0は偽、それ以外は真とされていますが、逆になってしまうことがあります。

ijf********さん

2019/10/822:32:36

C言語では0は偽、それ以外は真とされていますが、逆になってしまうことがあります。

おそらく、固定小数点表示などで、符号ビットが0なら正数、1なら負数…つまり、0はポジティブなイメージ、1はネガティブなイメージで、真はポジティブイメージ、偽はネガティブイメージ…そのために混同してしまっているのだと思いますが…
なにか混同しないコツなどありますでしょうか?
符号ビットに関しても、あれ、0が正数だっけ、1が正数だっけ…とこんがらがることがあります。

補足質問文冒頭の”逆になってしまう”というのはプログラムの動作の話ではなく、私の記憶の話です…

閲覧数:
38
回答数:
3

違反報告

ベストアンサーに選ばれた回答

meigr01さん

2019/10/903:47:35

こじ付けで覚えるより、符号ビットが0で、オール0は「+0」を表し、1の時は「-0」では「0」が2つできて不都合なので、「+0」本来の「0」として「-0」の方は負数の最小値を表すということが、2の補数計算の上でも都合がよいという選択を思い出してください。
この面倒くさい方法を一度考えると、忘れることがなくなるでしょう。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

n2q********さん

2019/10/907:51:34

~混同しないコツ~


「○○ではない」→ 偽、0
「○○である」→ 真、0 以外


【符号ビットが0なら正数、1なら負数】

「符号はついていない」→ 0
「符号が付いている」 → 1

マイナスの符号が付いているのかどうかで見ていただければ。



《参考》

const int flag = getchar() == '\n';

入力された文字が改行であれば flag は 1、改行以外であれば 0 となります。でも、何に関しての真偽なのか意味が分かりにくいと思います。


const int is_newline = getchar() == '\n';

こう書くと

「改行ではない」→ 0
「改行である」→ 1

と捉えることが出来ます。



const int flag = getchar() != '\n';

これも分かりにくいですよね。


const int is_not_newline = getchar() != '\n';

こう書けば、

「非改行ではない」(改行である)→ 0
「非改行である」→ 1

と読めます。


要は何に関しての真偽なのかについて立場を明確にすることです。(マイナス)符号の有無に関しての真偽、改行であるかどうかの真偽、非改行であるかどうかの真偽、という形です。

プロフィール画像

カテゴリマスター

あみやさん

2019/10/823:00:58

符号フラグと考えれば良いです。
0なら何も無し、1なら「-」のランプが灯る

真偽値とは何の関係もないので、変に関連付け無いほうが良いです。
真と偽もネガティブやポジティブとは、関係ありません。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる