C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C/C++言語の規格として、int 型のデータが右へシフト


(過去ログ 143 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■83822 / inTopicNo.1)  C/C++言語の規格として、int 型のデータが右へシフト
  
□投稿者/ くまくま (1回)-(2017/04/12(Wed) 15:50:42)

分類:[C/C++] 



C/C++言語の規格として、int 型のデータが右へシフトした場合
左側の各bitの値0になるかどうかという決まりはあるでしょうか。

それから左へシフトの場合右側のbitは0でしょうかどうかも。

あくまでも言語の標準規格としての質問で、具体処理系に依存したくないですけれども。

どうぞご教授お願いします。


引用返信 編集キー/
■83823 / inTopicNo.2)  Re[1]: C/C++言語の規格として、int 型のデータが右へシフト
□投稿者/ 774RR (507回)-(2017/04/12(Wed) 16:19:12)
C 言語規格書 JIS X 3010:2003 (ISO/IEC 9899:1999) 俗に言う C99
C++ 言語規格書 JIS X 3014:2003 (ISO/IEC 14882:2003) によると

E1<<E2 あるいは E1>>E2 であるとする。

左シフト:空いたビットには0を詰める
C : E1 が符号付きで非負の値であって E1×2**E2 が結果の型で表現できるなら適格
表現できないか E1 が符号付きで負の値であるとき、未定義動作
C++ : 上記但し書きなし(漏れているのか、故意に削除してあるのかは不明)

右シフト: E1 が符号なし数または、符号あり数で非負のとき、空いたビットには0を詰める
E1 が符号あり数で負のとき、結果の値は処理系定義

とありますな。もっと解説が必要ならそう言っておくんなまし。

引用返信 編集キー/
■83831 / inTopicNo.3)  Re[2]: C/C++言語の規格として、int 型のデータが右へシフト
□投稿者/ むー (2回)-(2017/04/12(Wed) 20:20:08)
> 右シフト: ....E1 が符号あり数で負のとき、結果の値は処理系定義

これはショックですね!
確か、負の数を右シフトする場合、
左側のbitを1で詰めるという学生時代の記憶を持っています。

そうでないと、右シフトによってデータ符号が変わってしまいます。
例えば、
右シフトに除算を行う場合、左側の空いたbitに1を詰めないと、でたらめな結果になりますね。


どうして「処理系定義」なの?

引用返信 編集キー/
■83833 / inTopicNo.4)  Re[3]: C/C++言語の規格として、int 型のデータが右へシフト
□投稿者/ 774RR (510回)-(2017/04/12(Wed) 21:19:07)
> どうして
は規格委員会の方に聞いてください。オイラは単に1人のユーザーなので。まあ想像することはできるけど

最終的に生成される機械語は
符号なし : SHLR (shift logical right) 命令=最上位ビットには0を埋める
符号あり : SHAR (shift arithmetic right) 命令=最上位ビットを現在値のまま残す
になることを、我々一般ユーザーは期待しているわけだ。

けど CPU によっては SHLR はあっても SHAR が無いものもあるかもしれない。
そういう CPU では符号付き数の右シフトに対しても SHLR を生成して良いよ、
混乱を避けるためマニュアルに挙動を明記しろよ(というのが処理系定義の意味)
というのが規格書の主張しているところだと思う。
(逆の状況 SHAR があって SHLR が無い、というのはかなり想像しがたい)

まあ心配しなくても
- オイラの手元にある組み込み系 CPU 向けコンパイラすべて
- x86/x64 系コンパイラすべて
で符号付き数の右シフトは「符号付き」 SHAR です。 SHAR が無い CPU にはお目にかかったことがない。

あと、負数の表記方法として
1の補数を使うシステムや「符号と絶対値」を使うシステムでは( C/C++ 言語仕様書はこれを拒絶していない)
負数の右シフトは「そもそも 1/2 ではない」のです。

右シフトが除算だと思いこんでいるとハマるです(その手の超レア処理系では)

引用返信 編集キー/
■83835 / inTopicNo.5)  Re[4]: C/C++言語の規格として、int 型のデータが右へシフト
□投稿者/ くまくま (2回)-(2017/04/13(Thu) 10:00:53)

いつも思うんですけど

774RRさんは本当に並大抵のユーザーではないですね。

専門家でしょ!

ご説明、まったく納得−−−−どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -