マクロは、次の仕様UINT8_C
で「stdint.h」に定義されています。マクロは、型に対応する整数定数式に展開されます。UINTN_C(value)
uint_leastN_t
ただし、実際には、実装は異なります。
#define UINT8_C(value) ((uint8_t) __CONCAT(value, U)) // AVR-libc
#define UINT8_C(x_) (static_cast<std::uint8_t>(x_)) // QP/C++
#define UINT8_C(c) c // GNU C Library
最初の 2 つの実装はほぼ同じように見えますが、3 番目の実装は異なる動作をします: たとえば、次のプログラム1
は AVR-libc と QP/C++ を使用して出力しますが-1
、glibc を使用します (符号付きの値の右シフトは符号ビットを伝搬するため)。
std::cout << (UINT8_C(-1) >> 7) << std::endl; // prints -1 in glibc
の実装はUINT16_C
同じ動作を表示しますがUINT32_C
、定義にU
接尾辞が含まれているため、 ではありません。
#define UINT32_C(c) c ## U
興味深いことに、glibc の の定義は、バグ報告により2006 年UINT8_C
に変更されました。以前の定義は でしたが、整数昇格規則により、誤った出力 ( )が生成されました。#define UINT8_C(c) c ## U
false
-1 < UINT8_C(0)
3 つの定義はすべて標準に従って正しいですか? これら 3 つの実装の間に (負の定数の処理以外に) 違いはありますか?