なんかよくわかりませんがデバッグ版とリリース版でビットフィールドの入れ替え結果が違います。
可能性としてはどんなことが考えられるでしょうか?
変数の初期化をしてないところとか?
初期化はしていませんが、使う前に値を代入しているので関係ないと思っています。
補足
今までの経験上、初期値が同じ、計算式も同じでデバッグ版とリリース版で演算結果が異なるなどということは未経験で、変数の初期化をしない場合、デバッグ版はオール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秒ずれることがありますが、それは無関係です。
返信
間違った使い方とは?
どの辺が間違いですか?
回答2件
あなたの回答
tips
プレビュー