• ベストアンサー

補数(~)について

Fookyの回答

  • Fooky
  • ベストアンサー率71% (59/82)
回答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と定義すると、そのような場合に 不都合が起こるということです。

korei
質問者

お礼

回答ありがとうございます。 なるほど移植性を考えてということなのですね。   >long型のビット数はOSが変われば変わるので 確かにそうですね。 (~0L)としている意味がわかりました。

korei
質問者

補足

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

関連するQ&A

  • Win8REをマルチブートで起動させる方法

    Win8RE をsyslinuxに組み込むことはできませんでしょうか。VistaやWin7のREはsyslinuxでマルチブートできるようにUSBメモリーに作成しました。VistaやWin7の回復コンソール及びバックアップーツール は起動します。 Win8REだけうまくいきません。 syslinux.cfgの内容は以下のとおりです。 DEFAULT /syslinux/menu.c32 MENU TITLE SYSLINUX Boot Options Menu PROMPT 0 KBDMAP /syslinux/jp106.kbd MENU ROWS 14 MENU TABMSGROW 19 MENU CMDLINEROW 19 LABEL Puppy KERNEL /puppy/vmlinuz APPEND initrd=/puppy/initrd.gz psubdir=puppy LABEL KNOPPIX KERNEL /KNOPPIX/linux APPEND ramdisk_size=100000 init=/etc/init lang=ja apm=power-off vga=791 initrd=/KNOPPIX/minirt.gz nomce highres=off loglevel=0 libata.atapi_enabled=1 quiet SELINUX_INIT=NO nmi_watchdog=0 BOOT_IMAGE=knoppix LABEL WinPE-32bit KERNEL /grub.exe APPEND --config-file="find --set-root /winpe4_x86.iso;map /winpe4_x86.iso (0xff) || map --mem /winpe4_x86.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL WinPE-64bit KERNEL /grub.exe APPEND --config-file="find --set-root /winpe4_AMD64.iso;map /winpe4_AMD64.iso (0xff) || map --mem /winpe4_AMD64.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL Vista-32bit KERNEL /grub.exe APPEND --config-file="find --set-root /vista32.iso;map /vista32.iso (0xff) || map --mem /vista32.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL Vista-64bit KERNEL /grub.exe APPEND --config-file="find --set-root /vista64.iso;map /vista64.iso (0xff) || map --mem /vista64.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL Win7-64bit KERNEL /grub.exe APPEND --config-file="find --set-root /WinREamd64.iso;map /WinREamd64.iso (0xff) || map --mem /WinREamd64.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL Win8-32RE KERNEL /grub.exe APPEND --config-file="find --set-root /win8re.iso;map /win8re.iso (0xff) || map --mem /win8re.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL AVG Antivirus KERNEL /grub.exe APPEND --config-file="find --set-root /avg.iso;map /avg.iso (0xff) || map --mem /avg.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL Acronis Backup & Recovery KERNEL /grub.exe APPEND --config-file="find --set-root /acronis.iso;map /acronis.iso (0xff) || map --mem /acronis.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL Easeus To Do Backup KERNEL /grub.exe APPEND --config-file="find --set-root /easeus.iso;map /easeus.iso (0xff) || map --mem /easeus.iso (0xff);map --hook;chainloader (0xff);rootnoverify (0xff)" LABEL Paragon KERNEL /paragon/vmlinuzp APPEND initrd=/paragon/initrd.gz vga=0x314 language=en_US.UTF-8 medialable= LABEL Memtest86+ KERNEL /syslinux/memtest LABEL poweroff MENU LABEL * Poweroff * KERNEL /syslinux/poweroff.com LABEL reboot MENU LABEL * Reboot * KERNEL /syslinux/reboot.c32 Win8REの作成方法は下記サイトを参考にしました。Win7 AIKのDeploymentコマンドツールを使用しましたが、うまくいかなかったので、Windows ADKで試しました。Win8 Enterprize評価版からboot.wimを取り出してwinre.wimを作成後isoイメージを作成しました。作成した、isoイメージはUSBメモリーのルートディレクトリにコピーしてあります。 <参考サイト>  http://d.hatena.ne.jp/palm84/20091024/1256479144 マルチブーとメニューからWin8-32REを選択するとWin8回復コンソールの起動画面が出るのですが、その後、下記エラー表示がでます。 実際のSYSTEMROOT ディレクトリ(X:\WINDOWS)が構成されたディレクトリ(X:\Windows.~bt\Windows)と異なるため、Windows PEを開始できません。このディレクトリは、dism.exeの/set-targetpathコマンドで構成できます。詳細についてはマニュアルを参照してください。 以上がエラー内容です。参考になるサイトやアドバイスがあれば、よろしくお願いします。

  • DOSバッチでUNIXテキストファイルの文字列置換

    お世話になります。 早速ですが、 「DOSバッチでテキストファイルの文字列置換を行うプログラム」がいろいろ紹介されていたので、 皆さんのプログラムを流用させていただき、勝手に継ぎ足したDOSバッチプログラムを以下の ように作りました。 このDOSバッチで置換されたテキストファイルに2つの問題が発生して困っています。 問題 1)UNIXテキストファイルの改行コードがLFからCR+LFに変ってしまう。     文字列置換した後にファイルサイズが大きくなっていたので発見しました。      問題 2)空白行がなくなる。     DOSプログラムでは、対応不可でしょうか?     やはり、sed,awk,WHS,power shell を使わないと解決しませんか? -(DOSプログラム f0.bat)------------------------------------------------------ ::** @echo off setlocal ENABLEDELAYEDEXPANSION set fname=%1 copy /b %fname% org >nul type nul >%fname% for /f "delims=" %%a in (org) do (set line=%%a&&set l=!line:abc=xxx!&&echo !l!>>%fname%) del org goto end :end exit /b 0 -(実行時の標準出力結果 list)----------------------------------------------- C:\>setlocal ENABLEDELAYEDEXPANSION C:\>set fname=t22.txt C:\>copy /b t22.txt org 1>nul C:\>type nul 1>t22.txt C:\>for /F "delims=" %a in (org) do (set line=%a && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=J0000000 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=HHH && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=519 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.98302 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.016114 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=0 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=abc && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>del org C:\>goto end C:\>exit /b 0 --(置換前 t22.org LF改行コード)-------------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 abc --(置換後 t22.txt CR+LF改行コード)----------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 xxxx ------------------------------------------ 皆さんのご意見、ご指導をお待ちしてます。

  • 2の補数について

    情報処理試験(基本情報)用の考え方という前提でお聞きします。 「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。 この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします) として記述されているものは、もう2の補数になっていると考えていいのでしょうか? それともこれを、今から2の補数に直すのですか? (もし直すのであれば、最上位ビットの符号が変わるのでしょうか?) 違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、 「-A」の2の補数は「A」になるんでしょうか? それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という ことになるのでしょうか? 解りにくくてすみません。

  • 補数

    10進数の -6と-51 を2,8,16進数で表すにはどうすればいいのですか? 過程を詳しく知りたいです。 マイナスが入るとどうすればいいのかわからないです。

  • 2の補数

    2進数の0と1を反転し,その結果に1を加えれば数の符号が変わるのはなぜですか?

  • 補数

    10進数の補数の問題で、決められた数値が1000で与えられた数値が50のときの10の補数が50となるのは分かるのですが、桁数を8桁までに限定したときの10進数89467の10の補数を求めるという問題のとき、「桁数を8桁までに限定する」というのはどういうことなのか教えてください。

  • 補数について教えてください!

    情報処理技術者試験の内容なんですが、やり方も理解できず悩んでいます。教えてください。 その1. 2の補数を使って解きなさい   0110  -)0111 ------------ その2. 次の2進数は2の補数であらわした負の値である。符号付きの10進数に変換しなさい。  1) 1001  2) 1010  3) 1111  4) 1000 その3. 次の10進数を2の補数(4ビット)に変換しなさい。  1)-6  2)-3  3)-5  4)-4 本を見ながら解いているのですがいまいち理解できません。お手数お掛けしますが、解る方がいらっしゃいましたら解説付で教えてくださると助かります!よろしくお願いいたします!

  • 補数

    10進数の2の補数は8 8進数の7の補数は1 2進数の1の補数は1 10進数の9の補数は4 と授業でやりました。 なぜこのようになるのか全くわかりませんでした。 過程を詳しく知りたいです。

  • 2の補数について

    みなさん教えてください。 今、情報関係の仕事に就き資格を取ろうと思っています。 その資格試験の問題に、下記のような問題が出てきて困っています。 考え方と回答を教えて頂けませんか。 お願いします。 (問題) 「16ビットを2の補数で表したとき、10進数の範囲は?」

  • 2の補数

    (1)10進数1、2、3の値を2進数3桁で記述しなさい。またこれらの2の補数を求め3桁で記述しなさい。 (2)2進数における「2の補数」は、コンピュータにおける数値の扱いにおいて重要な役割を担うことができる。その役割について説明しなさい。 (3) (1)の解答から(2)で解答した役割は適切に機能していることが分かる。その理由を説明しなさい。 (4)2進数で表記したある数値の「2の補数」の求め方としてして、「各桁の1と0を反転し、それに1を加える」という方法がある。この方法が成立する理由を説明しなさい。(ヒント:2^b-1がどういう数であるかを考えるとよい) この問題の(2)からどう説明していいか分かりません。 どなたか教えて下さい。