OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

補数(~)について

  • 困ってます
  • 質問No.153969
  • 閲覧数132
  • ありがとう数6
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 98% (92/93)

下記のようにenumの中で、(~0L) という記述があります。
これは反転して、「RE_SET_ALL=1」となるのですか?
また、直値を入れるのではなく、(~0L)としているメリットは
あるのでしょうか?


/* E:SetOff */
typedef enum {
RD_SET_ALL=(~0L),
RD_SET_OFF=-1,
RD_SET_DEL=-2,
RD_BYTE_OFF=0xff
}RdeSetOff;
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル7

ベストアンサー率 52% (10/19)

>(~0L)は移植性を考えてということは良く分かりました。
>では他の変数に(RD_SET_OFF = -1等)は、直値を入れてますが、
>これは移植性がないのではないでしょうか?
「~0」は0に対して1の補数をとるので、全てのビットが1に成ります。
「-1」は多くの処理系では1に対して2の補数を取るので、
全てのビットが1に成りますが、全ての処理系で負の数に2の補数が
使われているわけではないので、
全てのビットが1に成っていることを期待するプログラムは良くないわけです。

しかし、「-1」を内部のビット表現に依存しない形で(単に-1として)使う分
には問題ないわけです。
多分、プログラム中でも、RD_SET_OFFやRD_SET_DELは、どのビットが0で
どのビットが1かを気にする使い方はしてないと思いますが。

なので、
>(enumの中には4変数定義されてますが、その他の変数(0L以外)に
>移植性がなければ意味がなくなりませんか?)
RD_SET_OFFがAllビット1、RD_SET_DELがLSBが0で残りは1というような
期待をした処理が無ければ移植性は失われません。
お礼コメント
korei

お礼率 98% (92/93)

回答ありがとうございました。
投稿日時 - 2002-03-27 17:23:02
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル11

ベストアンサー率 60% (182/303)

「~」は、1の補数演算子です。 0Lはlong型で表すので、32bitです。(マシンによって異なる場合あり) 0を32bitの2進数で表すと 00000000000000000000000000000000(0が32個)となるので、 ~0は 11111111111111111111111111111111(1が32個)となります。 10進数で表すと、signed long型なら -1、unsign ...続きを読む
「~」は、1の補数演算子です。
0Lはlong型で表すので、32bitです。(マシンによって異なる場合あり)
0を32bitの2進数で表すと 00000000000000000000000000000000(0が32個)となるので、
~0は 11111111111111111111111111111111(1が32個)となります。
10進数で表すと、signed long型なら -1、unsigned long型なら 4294967295 となります。
お礼コメント
korei

お礼率 98% (92/93)

「~0L」の意味はわかりました。
ありがとうございます。
投稿日時 - 2001-10-25 10:40:27


  • 回答No.2
レベル9

ベストアンサー率 71% (59/82)

finalanswerさんが全て答えられてますが、 補足です。 > また、直値を入れるのではなく、(~0L)としているメリットは > あるのでしょうか? これの答えはまさしく、 > マシンによって異なる場合あり です。移植性を確保するためにはプリミティブな 表現はできるだけ避けるべきです。 例えば、現在の時刻を秒数で表す変数型time_typeが、 ...続きを読む
finalanswerさんが全て答えられてますが、
補足です。

> また、直値を入れるのではなく、(~0L)としているメリットは
> あるのでしょうか?

これの答えはまさしく、

> マシンによって異なる場合あり

です。移植性を確保するためにはプリミティブな
表現はできるだけ避けるべきです。

例えば、現在の時刻を秒数で表す変数型time_typeが、

typedef unsigned long time_type;

と表されている(time_type = unsigned long)、
ということを知っていたとしても、プログラム中で
time_typeの代わりにunsigned longを使うのは
避けるべきです。

もし、unsigned longで現在の時刻を表しきれない
事態が発生して、

typedef unsigned long long time_type;

と、time_type型が定義し直された場合、
time_type型を使っているのなら、コンパイルし直す
だけで済みますが、unsigned longをそのまま使って
いたとすると、ソースコード中で、time_typeの意味で
使っていたunsigned longを全てunsinged long longに
書きなおさなければなりません。

これと同じ事で、あなたの環境ではlong型で全ての
ビットが立っていると4294967295になるかも知れませんが、
他のOSでは全てのビットが立っているlong型の数値は
全く別の値になるかもしれません。

別の言い方をすると、このプログラムでは、RD_SET_ALLが
4294967295であることが重要なのではなく、RD_SET_ALLが
ビットが全て立ったlong型であることが重要である、という
ことです。で、long型のビット数はOSが変われば変わるので、
RD_SET_ALLを4294967295と定義すると、そのような場合に
不都合が起こるということです。
補足コメント
korei

お礼率 98% (92/93)

(~0L)は移植性を考えてということは良く分かりました。
では他の変数に(RD_SET_OFF = -1等)は、直値を入れてますが、
これは移植性がないのではないでしょうか?
(enumの中には4変数定義されてますが、その他の変数(0L以外)に
移植性がなければ意味がなくなりませんか?)


よろしければ回答をお願いします。
投稿日時 - 2001-10-25 10:42:34
お礼コメント
korei

お礼率 98% (92/93)

回答ありがとうございます。
なるほど移植性を考えてということなのですね。
 
>long型のビット数はOSが変われば変わるので

確かにそうですね。
(~0L)としている意味がわかりました。
投稿日時 - 2001-10-25 10:42:28
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ