C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
Re[4]: C/C++言語の規格として、int 型のデータが右へシフト
(過去ログ 143 を表示中)
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法/規約
トピック表示
ランキング
記事検索
過去ログ
[トピック内 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
-