質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

827閲覧

ビットフィールドの入れ替えが、デバッグ版とリリース版で結果が違う

qqfsdfsafd

総合スコア599

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/12/17 02:42

編集2021/12/17 09:59

なんかよくわかりませんがデバッグ版とリリース版でビットフィールドの入れ替え結果が違います。

可能性としてはどんなことが考えられるでしょうか?

変数の初期化をしてないところとか?

初期化はしていませんが、使う前に値を代入しているので関係ないと思っています。

補足
今までの経験上、初期値が同じ、計算式も同じでデバッグ版とリリース版で演算結果が異なるなどということは未経験で、変数の初期化をしない場合、デバッグ版はオール0が入りリリース版はデタラメな値で初期化されたということはありました。

他にどんなことが考えられますか?

【追記】
ソースコードです。
用途は戻り値の難読化です。
デバッグ版とリリース版で戻り値が違います。
それだけではなく、↓こちらのprintfを入れるとまた戻り値が変わります。
//printf("%lld\n", u64.time64);
意味がわかりません。

C++

1typedef union { 2 __time64_t time64; 3 char char8[8]; 4 struct { 5 unsigned bit0 : 1; 6 unsigned bit1 : 1; 7 unsigned bit2 : 1; 8 unsigned bit3 : 1; 9 unsigned bit4 : 1; 10 unsigned bit5 : 1; 11 unsigned bit6 : 1; 12 unsigned bit7 : 1; 13 unsigned bit8 : 1; 14 unsigned bit9 : 1; 15 unsigned bit10 : 1; 16 unsigned bit11 : 1; 17 unsigned bit12 : 1; 18 unsigned bit13 : 1; 19 unsigned bit14 : 1; 20 unsigned bit15 : 1; 21 unsigned bit16 : 1; 22 unsigned bit17 : 1; 23 unsigned bit18 : 1; 24 unsigned bit19 : 1; 25 unsigned bit20 : 1; 26 unsigned bit21 : 1; 27 unsigned bit22 : 1; 28 unsigned bit23 : 1; 29 unsigned bit24 : 1; 30 unsigned bit25 : 1; 31 unsigned bit26 : 1; 32 unsigned bit27 : 1; 33 unsigned bit28 : 1; 34 unsigned bit29 : 1; 35 unsigned bit30 : 1; 36 unsigned bit31 : 1; 37 unsigned int bit32 : 32; 38 } bit64; 39} Union64; 40 41typedef union { 42 int test; 43 struct { 44 unsigned bit19 : 1; 45 unsigned bit30 : 1; 46 unsigned bit9 : 1; 47 unsigned bit29 : 1; 48 unsigned bit20 : 1; 49 unsigned bit17 : 1; 50 unsigned bit22 : 1; 51 unsigned bit8 : 1; 52 unsigned bit13 : 1; 53 unsigned bit4 : 1; 54 unsigned bit31 : 1; 55 unsigned bit24 : 1; 56 unsigned bit25 : 1; 57 unsigned bit16 : 1; 58 unsigned bit2 : 1; 59 unsigned bit0 : 1; 60 unsigned bit21 : 1; 61 unsigned bit14 : 1; 62 unsigned bit28 : 1; 63 unsigned bit15 : 1; 64 unsigned bit1 : 1; 65 unsigned bit10 : 1; 66 unsigned bit26 : 1; 67 unsigned bit18 : 1; 68 unsigned bit5 : 1; 69 unsigned bit23 : 1; 70 unsigned bit12 : 1; 71 unsigned bit7 : 1; 72 unsigned bit3 : 1; 73 unsigned bit27 : 1; 74 unsigned bit11 : 1; 75 unsigned bit6 : 1; 76 } bit32; 77} Union32; 78 79static Union64 u64, u64_Now; 80static Union32 u32; 81 82int Test(const char* pTest) 83{ 84 struct tm tNow; 85 time_t now; 86 87 time(&now); 88 _gmtime64_s(&tNow, &now); 89 u64.time64 = u64_Now.time64 = _mkgmtime64(&tNow); 90 //printf("%lld\n", u64.time64); 91 92 for (int i = 0; i < 8; i++) { 93 u64.char8[i] ^= *(pTest + i); 94 } 95 96 u32.bit32.bit0 = u64.bit64.bit0; 97 u32.bit32.bit1 = u64.bit64.bit1; 98 u32.bit32.bit2 = u64.bit64.bit2; 99 u32.bit32.bit3 = u64.bit64.bit3; 100 u32.bit32.bit4 = u64.bit64.bit4; 101 u32.bit32.bit5 = u64.bit64.bit5; 102 u32.bit32.bit6 = u64.bit64.bit6; 103 u32.bit32.bit7 = u64.bit64.bit7; 104 u32.bit32.bit8 = u64.bit64.bit8; 105 u32.bit32.bit8 = u64.bit64.bit9; 106 u32.bit32.bit10 = u64.bit64.bit10; 107 u32.bit32.bit11 = u64.bit64.bit11; 108 u32.bit32.bit12 = u64.bit64.bit12; 109 u32.bit32.bit13 = u64.bit64.bit13; 110 u32.bit32.bit14 = u64.bit64.bit14; 111 u32.bit32.bit15 = u64.bit64.bit15; 112 u32.bit32.bit16 = u64.bit64.bit16; 113 u32.bit32.bit17 = u64.bit64.bit17; 114 u32.bit32.bit18 = u64.bit64.bit18; 115 u32.bit32.bit19 = u64.bit64.bit19; 116 u32.bit32.bit20 = u64.bit64.bit20; 117 u32.bit32.bit21 = u64.bit64.bit21; 118 u32.bit32.bit22 = u64.bit64.bit22; 119 u32.bit32.bit23 = u64.bit64.bit23; 120 u32.bit32.bit24 = u64.bit64.bit24; 121 u32.bit32.bit25 = u64.bit64.bit25; 122 u32.bit32.bit26 = u64.bit64.bit26; 123 u32.bit32.bit27 = u64.bit64.bit27; 124 u32.bit32.bit28 = u64.bit64.bit28; 125 u32.bit32.bit29 = u64.bit64.bit29; 126 u32.bit32.bit30 = u64.bit64.bit30; 127 u32.bit32.bit31 = u64.bit64.bit31; 128 129 return u32.test; 130}

追記
戻り値がデバッグ版とリリース版で4違います。
(リリース版の戻り値に+=4してやるとデバッグ版と同じになります。リリース版にprintfを入れてもデバッグ版と同じ戻り値になります。意味がわかりません。)

時間を使っているため、タイミングによっては1秒ずれることがありますが、それは無関係です。

返信
間違った使い方とは?
どの辺が間違いですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/12/17 03:25

コードを提示しよう
y_waiwai

2021/12/17 08:15

で、どういうふうに変わるんでしょうか。
退会済みユーザー

退会済みユーザー

2021/12/17 09:45

unionの間違った使い方をしているだけ。
guest

回答2

0

ベストアンサー

u32.bit32.bit8 = u64.bit64.bit9;

このtypoで3bit目(bit9)が不定になるから

投稿2021/12/18 04:32

編集2021/12/18 04:32
sigsegv

総合スコア895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qqfsdfsafd

2021/12/18 08:47

ありがとうございます!!!
guest

0

ありがとうございます!!!

投稿2021/12/18 08:47

qqfsdfsafd

総合スコア599

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問