これは何?
C/C++ で組み込み型を演算した結果の型がどうなるのかの表って見たことないなと思ったので作った。
試した環境は macOS(amd64) + clang++ なので、LP64。つまり、int は 32bit。long と long long は 64bit。
単なる char
には符号がある。
32bit 環境とかだと違った結果になると思う(自信はない)。
Windows の amd64 も LLP64 だからちがうかな。
型名は、1〜3 文字に省略したけどわかるよね。
( left + right )
まずは加算。
left\right | c | uc | sc | s | us | i | ui | l | ul | ll | ull | f | d | ld |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c | i | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
uc | i | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
sc | i | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
s | i | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
us | i | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
i | i | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
ui | ui | ui | ui | ui | ui | ui | ui | l | ul | ll | ull | f | d | ld |
l | l | l | l | l | l | l | l | l | ul | ll | ull | f | d | ld |
ul | ul | ul | ul | ul | ul | ul | ul | ul | ul | ull | ull | f | d | ld |
ll | ll | ll | ll | ll | ll | ll | ll | ll | ull | ll | ull | f | d | ld |
ull | ull | ull | ull | ull | ull | ull | ull | ull | ull | ull | ull | f | d | ld |
f | f | f | f | f | f | f | f | f | f | f | f | f | d | ld |
d | d | d | d | d | d | d | d | d | d | d | d | d | d | ld |
ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld |
四則演算は全部これ。
シフト以外のビット演算も同じだと思う。
見どころは ul()+ll()
が ull
になるところ。
( left << right )
続いてシフト。
left\right | c | uc | sc | s | us | i | ui | l | ul | ll | ull |
---|---|---|---|---|---|---|---|---|---|---|---|
c | i | i | i | i | i | i | ui | l | ul | ll | ull |
uc | i | i | i | i | i | i | ui | l | ul | ll | ull |
sc | i | i | i | i | i | i | ui | l | ul | ll | ull |
s | i | i | i | i | i | i | ui | l | ul | ll | ull |
us | i | i | i | i | i | i | ui | l | ul | ll | ull |
i | i | i | i | i | i | i | ui | l | ul | ll | ull |
ui | i | i | i | i | i | i | ui | l | ul | ll | ull |
l | i | i | i | i | i | i | ui | l | ul | ll | ull |
ul | i | i | i | i | i | i | ui | l | ul | ll | ull |
ll | i | i | i | i | i | i | ui | l | ul | ll | ull |
ull | i | i | i | i | i | i | ui | l | ul | ll | ull |
シフトの場合は、右辺は結果の型に影響を与えない。
( cond ? left : right )
続いて条件演算。
left\right | c | uc | sc | s | us | i | ui | l | ul | ll | ull | f | d | ld |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c | c | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
uc | i | uc | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
sc | i | i | sc | i | i | i | ui | l | ul | ll | ull | f | d | ld |
s | i | i | i | s | i | i | ui | l | ul | ll | ull | f | d | ld |
us | i | i | i | i | us | i | ui | l | ul | ll | ull | f | d | ld |
i | i | i | i | i | i | i | ui | l | ul | ll | ull | f | d | ld |
ui | ui | ui | ui | ui | ui | ui | ui | l | ul | ll | ull | f | d | ld |
l | l | l | l | l | l | l | l | l | ul | ll | ull | f | d | ld |
ul | ul | ul | ul | ul | ul | ul | ul | ul | ul | ull | ull | f | d | ld |
ll | ll | ll | ll | ll | ll | ll | ll | ll | ull | ll | ull | f | d | ld |
ull | ull | ull | ull | ull | ull | ull | ull | ull | ull | ull | ull | f | d | ld |
f | f | f | f | f | f | f | f | f | f | f | f | f | d | ld |
d | d | d | d | d | d | d | d | d | d | d | d | d | d | ld |
ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld | ld |
第二項と第三項が同じ型だとその型になる。
見どころは、cond ? c() : sc()
が i
になるところ。
かな。