web-dev-qa-db-ja.com

C ++でunsigned char型の整数リテラルを指定するにはどうすればよいですか?

次のように、unsigned long型の整数リテラルを指定できます。

const unsigned long example = 9UL;

署名されていないcharを同様にするにはどうすればよいですか?

const unsigned char example = 9U?;

これは、コンパイラの警告を回避するために必要です。

unsigned char example2 = 0;
...
min(9U?, example2);

私が現在持っている冗長な回避策を避けて、別の行の変数で9を宣言せずにminを呼び出す行に「unsigned char」が表示されないようにしたいと思います。

min(static_cast<unsigned char>(9), example2);
48
WilliamKF

Cは、幅がintよりも小さい整数定数を指定する標準的な方法を提供していません。

ただし、_stdint.h_は、Cで取得するのと同じように、探しているものに非常に近い処理を実行するUINT8_C()マクロを提供します。

しかし、ほとんどの人はサフィックスを使用しない(int定数を取得する)またはUサフィックスを使用する(_unsigned int_定数を取得する)だけです。 charサイズの値では問題なく機能しますが、それでも_stdint.h_マクロから得られるものはほとんどすべてです。

28
Michael Burr

C++ 11では、ユーザー定義のリテラルが導入されました。次のように使用できます。

inline constexpr unsigned char operator "" _uchar( unsigned long long arg ) noexcept
{
    return static_cast< unsigned char >( arg );
}

unsigned char answer()
{
    return 42;
}

int main()
{
    std::cout << std::min( 42, answer() );        // Compile time error!
    std::cout << std::min( 42_uchar, answer() );  // OK
}
38
user4832129

定数をキャストできます。例えば:

min(static_cast<unsigned char>(9), example2);

コンストラクター構文を使用することもできます。

typedef unsigned char uchar;
min(uchar(9), example2);

Typedefは、すべてのコンパイラで必要なわけではありません。

20
janm

Visual C++を使用していて、コンパイラ間の相互運用性が必要ない場合は、数値にi8サフィックスを使用して、符号なし8ビット定数にすることができます。

min(9ui8, example2);

'9'のような実際のchar定数ではこれを行うことはできません。

11
Mr Lister

std::minを使用していると仮定すると、実際に行う必要があるのは、minが使用する型を明示的に指定することです。

unsigned char example2 = 0;
min<unsigned char>(9, example2);
8
E.M.

単にconst unsigned char example = 0;は問題ありません。

4
Kyle Lutz

問題は、「C++でunsigned char型の整数「リテラル」を指定する方法」でした。識別子の宣言方法ではありません。

エスケープのバックスラッシュと8進数をアポストロフィで使用します。 (例: '\ 177')

8進数値は常に符号なしと見なされます。

0
Clive

私は考えます '\0'は値が0のcharリテラルですが、要点もわかりません。

0
Axel Gneiting

Unsigned char型のサフィックスはありません。整数定数はintまたはlongsignedまたはunsigned)であり、C99ではlong long。値がunsigned charsの有効な範囲内にある限り、心配することなくプレーンな「U」サフィックスを使用できます。

0
user261840