No.1
- 回答日時:
「~」は、1の補数演算子です。
0Lはlong型で表すので、32bitです。(マシンによって異なる場合あり)
0を32bitの2進数で表すと 00000000000000000000000000000000(0が32個)となるので、
~0は 11111111111111111111111111111111(1が32個)となります。
10進数で表すと、signed long型なら -1、unsigned long型なら 4294967295 となります。
No.2
- 回答日時:
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と定義すると、そのような場合に
不都合が起こるということです。
この回答への補足
(~0L)は移植性を考えてということは良く分かりました。
では他の変数に(RD_SET_OFF = -1等)は、直値を入れてますが、
これは移植性がないのではないでしょうか?
(enumの中には4変数定義されてますが、その他の変数(0L以外)に
移植性がなければ意味がなくなりませんか?)
よろしければ回答をお願いします。
回答ありがとうございます。
なるほど移植性を考えてということなのですね。
>long型のビット数はOSが変われば変わるので
確かにそうですね。
(~0L)としている意味がわかりました。
No.3ベストアンサー
- 回答日時:
>(~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というような
期待をした処理が無ければ移植性は失われません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 3個のfileのセルデータを1個のfileのセルに貼り付けるVBAコードですが。 1 2023/02/20 09:21
- スポーツサイクル ディレーラーについてです。 現装しているのはSHIMANO RD-5701SS 105(10速)です 1 2022/04/26 12:55
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- ブルーレイ・プレーヤー・レコーダー AV機器の開発者数 6 2023/04/15 17:44
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Visual Basic(VBA) Sheet1をフィルターで「りんご」を抽出し、Sheet2へ地域を貼り付ける下記マクロを変更して S 2 2022/12/11 03:01
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
8ビットのデータの、先頭ビット...
-
fortran
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
情報科学の飽和演算、ラップア...
-
ビットの取り出し方法
-
verilog 符号付加減算(最上位...
-
スロースキャンコンピュータ 加...
-
16ビットCPUで32ビットの計算方法
-
上位ビットと下位ビットの入れかえ
-
PLC 命令について
-
[VBS] 素早くローテート演算したい
-
CASL2(減算命令と比較命令の...
-
シフト演算子について・・・意...
-
実数rの3乗はどうするの?
-
通常の表記から逆ポーランド表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAのIf,Then 構...
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
シーケンス制御についての質問...
-
文字参照は10進数と16進数では...
-
算術シフト演算が成り立つ理由...
-
03分22秒36のような時間の単位...
-
Python: 数値を反転させたい
-
上位ビットと下位ビットの入れかえ
-
verilog 符号付加減算(最上位...
-
命令について
-
剰余の法が大きい場合のアルゴ...
-
ビット列を表示するプログラム
-
アクセス(2003)のVBAでビット...
-
16ビットCPUで32ビットの計算方法
-
C言語で128bitの2進数のビット...
-
10進数(+-)→2進数への変換(2)
-
シーケンス制御について質問で...
おすすめ情報