質問するログイン新規登録

質問編集履歴

2

追記:自己調査

2015/04/15 18:01

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -42,4 +42,86 @@
42
42
  の違いです.この二つは異なるシンタックスの同じ動作だと解釈して上のようにイメージしたので,根本からして違うのならこの解釈は間違っていることになります.
43
43
 
44
44
  この二つの違いは何なのでしょうか?
45
- そしてこの解釈は正しいのでしょうか?
45
+ そしてこの解釈は正しいのでしょうか?
46
+
47
+ [追記:2015/4/16]
48
+ // macrosTest.h
49
+ #ifndef TESTER_MACROS_MACROTEST_H_
50
+ #define TESTER_MACROS_MACROTEST_H_
51
+
52
+ #ifndef _WINDOWS_
53
+ typedef unsigned char BYTE;
54
+ typedef unsigned short WORD;
55
+ typedef unsigned long DWORD;
56
+ typedef DWORD COLORREF;
57
+ #endif
58
+
59
+ // WinAPIにあるRGBマクロの動作確認
60
+ #ifndef _WINGDI_H_
61
+ #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
62
+ #endif
63
+
64
+ #define R_CASE1(r) (WORD)(BYTE)(r)
65
+ #define R_CASE2(r) (WORD)((BYTE)(r))
66
+ #define R_SHIFT(r) (WORD)(BYTE)r << 8
67
+ #define R_CASE1_SHIFT(r) (WORD)(BYTE)(r) << 8
68
+ #define R_CASE2_SHIFT(r) (WORD)((BYTE)(r)) << 8
69
+
70
+ #define TRGB(r,g,b) ((COLORREF)(((BYTE)(r)|(((WORD)(BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
71
+ // RGBマクロここまで
72
+
73
+ #endif
74
+
75
+
76
+ // main.cpp
77
+ #ifndef _IOSTREAM_
78
+ #include <iostream>
79
+ #endif
80
+
81
+ #include "macrosTester.h"
82
+
83
+ int main()
84
+ {
85
+ using namespace std;
86
+
87
+ char a{ 1 }, b{ 1 };
88
+ WORD w1{ 0 }, w2{ 0 }, w3{ 0 };
89
+
90
+ // 両方とも2^(1+8) = 512になることを期待したマクロ
91
+ w1 = R_CASE1_SHIFT(a + b);
92
+ cout << "R_CASE1 : r = " << w1
93
+ << ", type = " << typeid(w1).name() << endl;
94
+ w2 = R_CASE2_SHIFT(a + b);
95
+ cout << "R_CASE2 : r = " << w2
96
+ << ", type = " << typeid(w2).name() << endl;
97
+
98
+ // 結果:期待通り
99
+
100
+ // ではそもそも欠点のあるタイプでは?
101
+ w3 = R_SHIFT(a + b);
102
+ cout << "R_SHIFT : r = " << w3
103
+ << ", type = " << typeid(w3).name() << endl;
104
+
105
+ // <<演算子の優先順位が~のエラーが出るものの512
106
+
107
+
108
+ // RGBマクロ本家のg部分のシフトを(DWORD)(BYTE)(g)に
109
+ // 変更した場合との比較
110
+ char r{ 1 }, g{ 2 };
111
+ DWORD result1{ 0 }, result2{ 0 };
112
+
113
+ // 意地悪な式を代入
114
+ result1 = RGB(r+a, r%3/(g+a+b)*a+b, b+b);
115
+ cout << "RGB = " << result1
116
+ << ", type = " << typeid(result1).name() << endl;
117
+ result2 = TRGB(r+a, r%3/(g+a+b)*a+b, b+b);
118
+ cout << "TRGB = " << result2
119
+ << ", type = " << typeid(result2).name() << endl;
120
+
121
+ // 結果:どちらも同じ131330
122
+
123
+ return 0;
124
+ }
125
+
126
+ ※少なくともvisual C++2013版では特に意味はないみたいです.
127
+ これがC++98や03になってくるとコンパイラの賢さとかでまた変わってくるかもしれませんが.

1

4byteめの可視化

2015/04/15 18:01

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -29,10 +29,10 @@
29
29
 
30
30
 
31
31
  ((DWORD)b) << 16
32
- [b][b] [0][0] [0][0]
32
+ [0][0] [b][b] [0][0] [0][0]
33
33
 
34
34
  ((r | ((WORD)g) << 8 )) | (((DWORD)b) << 16)
35
- [b][b] [g][g] [r][r]
35
+ [0][0] [b][b] [g][g] [r][r]
36
36
 
37
37
  となっているのではないかと推測しました.
38
38
  疑問なのは,