[過去ログ] C++相談室 part130 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
554(1): (ワッチョイ 9f32-LvKX) 2017/06/25(日)19:00 ID:ogKde9930(2/2) AAS
uint32_tをuint64_tに変えたら一致するようになりました
ヒントになります?
555(1): (ワッチョイ 9faf-6L/r) 2017/06/25(日)19:15 ID:0WoCYScE0(1) AAS
VC++2015で調べたらaaa,bbbは8byteでbit_tのメンバーは
b0: 0ビット目
b1: 5ビット目
b2: 10ビット目
b3: 15ビット目
b4: 20ビット目
b5: 25ビット目
b6: 32ビット目
b7: 37ビット目
に配置されてた
省4
556: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f15-LvKX) 2017/06/25(日)23:08 ID:y0reYziw0(1) AAS
英語を読むのがだるいので JIS の仕様を見てみた。
まずは C99 (に相当する JISX3010:2003) の 6.7.2.1 にはこうある。
> 処理系は、ビットフィールドを保持するに十分な大きさの任意のアドレス付け可能な記憶域単位を割り付けてよい。
> 十分な領域が残っている場合、構造体内のビットフィールドの直後に続く別のビットフィールドは、同じ単位の隣接したビットに詰め込まなければならない。
> 十分な領域が残っていない場合、入り切らなかったビットフィールドを次の単位に入れるか、又は隣接した単位の境界をまたがせるかは、処理系定義とする。
> 単位内のビットフィールド割付けの順序 (上位から下位か又は下位から上位か) は、処理系定義とする。
この理屈にてらして >>555 を解釈すると、 VC++2015 での記憶域単位は 4 バイトで、ビットフィールドが単位に収まらなかった場合には次の単位に入れる
という選択を取っていることになる。
で、 C++03 (JISX3014:2003) ではどうかというと 9.6 にこうある。
> クラスオブジェクト内のビットフィールドの割り当て方は処理系定義とする。 ビットフィールドの境界調整は、処理系定義とする。 ビットフィールドは、何らかのアドレス取得可能な単位内に詰め込まれる。
省5
557: (オッペケ Sr0b-jRIn) 2017/06/25(日)23:47 ID:Tfx4tn9Gr(1) AAS
>常識的に考えれば (中略) ないだろうと思う
訳:ボクは非常識です
558: (スップ Sd3f-VrB2) 2017/06/26(月)00:18 ID:mZAJ/HXWd(1/4) AAS
トンチンカンな回答がほとんどで笑える
559(2): (ワッチョイ bfe4-Nep8) 2017/06/26(月)00:21 ID:yL9hwVgE0(1/2) AAS
正しい回答をお願いします
560: (スップ Sd3f-VrB2) 2017/06/26(月)00:29 ID:mZAJ/HXWd(2/4) AAS
byteの40bitとbの40bitが違う位置だから (ほとんどの環境で)
561: (スップ Sd3f-VrB2) 2017/06/26(月)00:32 ID:mZAJ/HXWd(3/4) AAS
8個のbがbyteをカバーしていない
562: (スップ Sd3f-VrB2) 2017/06/26(月)00:37 ID:mZAJ/HXWd(4/4) AAS
>>546 〜 >>551
回答するレベルじゃない
何も書かない方がマシ
563: (ワッチョイ bfe4-Nep8) 2017/06/26(月)01:00 ID:yL9hwVgE0(2/2) AAS
そもそも専門的な質問は2chで聞くべきじゃないし
信頼できる専門書を買うべき
564(1): (ワッチョイ ffaa-4OJu) 2017/06/26(月)01:09 ID:RgMKiEkv0(1/2) AAS
共用体などは、C++を、10年以上勉強してから使え。
そもそも、初心者が使い道を知らないだろ
そもそも、5バイトは、40ビットだけど、
ビットフィールドが何バイトの領域に確保されるかも知らないのに、使うな。
処理系依存の機能を使うな
MISRA-C でも使用禁止だし、素人が使う共用体なんて、
バグだらけで製品で使えない
どの本にも、共用体を使った例など、載っていないだろ
565: (ワッチョイ 9f89-RNzd) 2017/06/26(月)01:26 ID:YVNj3DlL0(1) AAS
>>564
質問者はただの学習目的かもしれんのに、
素人だとか製品では〜とか批判するのは的外れだろう
566: (ワッチョイ 374b-ckEx) 2017/06/26(月)01:34 ID:jY+d4s2A0(1) AAS
>>559
すでに言われてるがまとめると>>545の状況では先頭から
byteは連続する40bit
bit_tは使わない2bitをはさんだ42bit
を使用するのでbyte-bit_t間では
余分なbitの取得・必要なbitの欠落が起きて完全な情報のやりとりにならない
567: (ワッチョイ 9f9f-Yx6S) 2017/06/26(月)01:50 ID:/d8dR7Ut0(1) AAS
5bitづつだとどうしてもアドレス跨ぎが発生するからな
4bitづつなら収まるけど
568: (オッペケ Sr0b-jRIn) 2017/06/26(月)08:14 ID:g/kuRdPjr(1/2) AAS
>信頼できる専門書を買うべき
ここは信頼できる回答が示されていても日本語が読めない低能が不毛なレスを続ける所なのだが
その典型例が>>559ということに本人が気付くことは無いのであった
569: (オッペケ Sr0b-jRIn) 2017/06/26(月)20:30 ID:g/kuRdPjr(2/2) AAS
そう言えば規格的には>>545の使い方はNGなので
>>551が言っていることはあながち間違いでもない
570: (ワッチョイ 9f1b-ZNvc) 2017/06/26(月)20:36 ID:cFoP2i7u0(1) AAS
規格的には処理系定義なので処理系のマニュアル等で確認して使うならNGではないな
571: (ワッチョイ 179a-VrB2) 2017/06/26(月)20:43 ID:GM19K0OY0(1/2) AAS
>>551は質問の回答じゃないから
572(1): (ワッチョイ ffaa-4OJu) 2017/06/26(月)23:25 ID:RgMKiEkv0(2/2) AAS
共用体で、バイト配列とビットフィールドは、互換性がない型だから使えない。
最低でも、10年以上勉強していない者は、共用体でバグだらけになるから使うな
ビットフィールドのメモリ割付位置は、処理系依存だから、
他のOS・OSのビット数(32/64ビット)・他のコンパイラなどで使えない
また、コンパイラのバージョンアップで、再コンパイルするだけでも、
メモリ割付位置は変わるから、バグ有りで使えない
コンパイルエラーにならず、実行時エラーになるようなものは使えない
573: (ワッチョイ 179a-VrB2) 2017/06/26(月)23:35 ID:GM19K0OY0(2/2) AAS
なんかムキになってる
相変わらずズレてるね
上下前次1-新書関写板覧索設栞歴
あと 429 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.345s*