質問編集履歴

2

追記:自己調査

2015/04/15 18:01

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -87,3 +87,167 @@
87
87
  この二つの違いは何なのでしょうか?
88
88
 
89
89
  そしてこの解釈は正しいのでしょうか?
90
+
91
+
92
+
93
+ [追記:2015/4/16]
94
+
95
+ // macrosTest.h
96
+
97
+ #ifndef TESTER_MACROS_MACROTEST_H_
98
+
99
+ #define TESTER_MACROS_MACROTEST_H_
100
+
101
+
102
+
103
+ #ifndef _WINDOWS_
104
+
105
+ typedef unsigned char BYTE;
106
+
107
+ typedef unsigned short WORD;
108
+
109
+ typedef unsigned long DWORD;
110
+
111
+ typedef DWORD COLORREF;
112
+
113
+ #endif
114
+
115
+
116
+
117
+ // WinAPIにあるRGBマクロの動作確認
118
+
119
+ #ifndef _WINGDI_H_
120
+
121
+ #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
122
+
123
+ #endif
124
+
125
+
126
+
127
+ #define R_CASE1(r) (WORD)(BYTE)(r)
128
+
129
+ #define R_CASE2(r) (WORD)((BYTE)(r))
130
+
131
+ #define R_SHIFT(r) (WORD)(BYTE)r << 8
132
+
133
+ #define R_CASE1_SHIFT(r) (WORD)(BYTE)(r) << 8
134
+
135
+ #define R_CASE2_SHIFT(r) (WORD)((BYTE)(r)) << 8
136
+
137
+
138
+
139
+ #define TRGB(r,g,b) ((COLORREF)(((BYTE)(r)|(((WORD)(BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
140
+
141
+ // RGBマクロここまで
142
+
143
+
144
+
145
+ #endif
146
+
147
+
148
+
149
+
150
+
151
+ // main.cpp
152
+
153
+ #ifndef _IOSTREAM_
154
+
155
+ #include <iostream>
156
+
157
+ #endif
158
+
159
+
160
+
161
+ #include "macrosTester.h"
162
+
163
+
164
+
165
+ int main()
166
+
167
+ {
168
+
169
+ using namespace std;
170
+
171
+
172
+
173
+ char a{ 1 }, b{ 1 };
174
+
175
+ WORD w1{ 0 }, w2{ 0 }, w3{ 0 };
176
+
177
+
178
+
179
+ // 両方とも2^(1+8) = 512になることを期待したマクロ
180
+
181
+ w1 = R_CASE1_SHIFT(a + b);
182
+
183
+ cout << "R_CASE1 : r = " << w1
184
+
185
+ << ", type = " << typeid(w1).name() << endl;
186
+
187
+ w2 = R_CASE2_SHIFT(a + b);
188
+
189
+ cout << "R_CASE2 : r = " << w2
190
+
191
+ << ", type = " << typeid(w2).name() << endl;
192
+
193
+
194
+
195
+ // 結果:期待通り
196
+
197
+
198
+
199
+ // ではそもそも欠点のあるタイプでは?
200
+
201
+ w3 = R_SHIFT(a + b);
202
+
203
+ cout << "R_SHIFT : r = " << w3
204
+
205
+ << ", type = " << typeid(w3).name() << endl;
206
+
207
+
208
+
209
+ // <<演算子の優先順位が~のエラーが出るものの512
210
+
211
+
212
+
213
+
214
+
215
+ // RGBマクロ本家のg部分のシフトを(DWORD)(BYTE)(g)に
216
+
217
+ // 変更した場合との比較
218
+
219
+ char r{ 1 }, g{ 2 };
220
+
221
+ DWORD result1{ 0 }, result2{ 0 };
222
+
223
+
224
+
225
+ // 意地悪な式を代入
226
+
227
+ result1 = RGB(r+a, r%3/(g+a+b)*a+b, b+b);
228
+
229
+ cout << "RGB = " << result1
230
+
231
+ << ", type = " << typeid(result1).name() << endl;
232
+
233
+ result2 = TRGB(r+a, r%3/(g+a+b)*a+b, b+b);
234
+
235
+ cout << "TRGB = " << result2
236
+
237
+ << ", type = " << typeid(result2).name() << endl;
238
+
239
+
240
+
241
+ // 結果:どちらも同じ131330
242
+
243
+
244
+
245
+ return 0;
246
+
247
+ }
248
+
249
+
250
+
251
+ ※少なくともvisual C++2013版では特に意味はないみたいです.
252
+
253
+ これがC++98や03になってくるとコンパイラの賢さとかでまた変わってくるかもしれませんが.

1

4byteめの可視化

2015/04/15 18:01

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -60,13 +60,13 @@
60
60
 
61
61
  ((DWORD)b) << 16
62
62
 
63
- [b][b] [0][0] [0][0]
63
+ [0][0] [b][b] [0][0] [0][0]
64
64
 
65
65
 
66
66
 
67
67
  ((r | ((WORD)g) << 8 )) | (((DWORD)b) << 16)
68
68
 
69
- [b][b] [g][g] [r][r]
69
+ [0][0] [b][b] [g][g] [r][r]
70
70
 
71
71
 
72
72