問題タブ [stdint]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 「stdint.h」の実装が UINT8_C の定義に同意しないのはなぜですか?
マクロは、次の仕様UINT8_C
で「stdint.h」に定義されています。マクロは、型に対応する整数定数式に展開されます。UINTN_C(value)
uint_leastN_t
ただし、実際には、実装は異なります。
最初の 2 つの実装はほぼ同じように見えますが、3 番目の実装は異なる動作をします: たとえば、次のプログラム1
は AVR-libc と QP/C++ を使用して出力しますが-1
、glibc を使用します (符号付きの値の右シフトは符号ビットを伝搬するため)。
の実装はUINT16_C
同じ動作を表示しますがUINT32_C
、定義にU
接尾辞が含まれているため、 ではありません。
興味深いことに、glibc の の定義は、バグ報告により2006 年UINT8_C
に変更されました。以前の定義は でしたが、整数昇格規則により、誤った出力 ( )が生成されました。#define UINT8_C(c) c ## U
false
-1 < UINT8_C(0)
3 つの定義はすべて標準に従って正しいですか? これら 3 つの実装の間に (負の定数の処理以外に) 違いはありますか?
c - uint32_t を int32_t にキャストして後で比較する
1 つが unsigned int32 で、もう 1 つが signed int32 である 2 つの int を比較する方法を理解するのに苦労しています。この単純なプログラムを考えてみましょう:
この場合、a1
は符号付き 32 ビット整数の範囲を超えているため、デバッグ中に確認したように、キャストされた後は にb1
等しくなり-1
ます。ただし、これらの値は明らかに同じではありませんが、それでも「等しい」と出力されます。何が原因ですか?
c - stdatomic.h に atomic_uint_least16_t と atomic_uint_fast16_t が含まれているのに、atomic_uint16_t が含まれていないのはなぜですか?
stdatomic.h
タイプandのバージョンであるand がatomic_uint_least16_t
含まれているように見えますが、含まれていません。なんで?atomic_uint_fast16_t
_Atomic
stdint.h
uint_least16_t
uint_fast16_t
atomic_uint16_t
N1548 ドラフトの背景情報については、次のとおりです。
7.18.1.1 正確な幅の整数型
1 typedef 名
int
N_t
は、幅 N、パディング ビットなし、および 2 の補数表現を持つ符号付き整数型を指定します。したがって、int8_t
正確に 8 ビット幅の符号付き整数型を示します。2 typedef 名
uint
N_t
は、幅 N でパディング ビットのない符号なし整数型を指定します。したがって、uint24_t
正確に 24 ビット幅の符号なし整数型を示します。3 これらのタイプはオプションです。ただし、実装が幅が 8、16、32、または 64 ビットで、パディング ビットがなく、2 の補数表現を持つ (符号付きの型の場合) 整数型を提供する場合、対応する typedef 名を定義する必要があります。
7.18.1.2 最小幅の整数型
1 typedef 名
int_least
N_t
は、幅が少なくとも N の符号付き整数型を指定します。これより小さなサイズの符号付き整数型が少なくとも指定された幅を持つことはありません。したがって、int_least32_t
少なくとも 32 ビット幅の符号付き整数型を示します。2 typedef 名
uint_least
N_t
は、少なくとも N の幅を持つ符号なし整数型を指定します。これより小さなサイズの符号なし整数型が少なくとも指定された幅を持つことはありません。したがって、uint_least16_t
少なくとも 16 ビット幅の符号なし整数型を示します。3 次のタイプが必要です。
このフォームの他のタイプはすべてオプションです。
int_fast
(など、 N _t
/ uint_fast
N_t
タイプなどを含める)
段落3で強調する価値があります。
ただし、実装が幅が 8、16、32、または 64 ビットで、パディング ビットがなく、2 の補数表現を持つ (符号付きの型の場合) 整数型を提供する場合、対応する typedef 名を定義する必要があります。
これは、たとえば、2 の補数表現の 16 ビット整数として実装されるint
orのような型がある場合、実装でを定義する必要があることを意味します。short
int16_t
のatomic_
型はN1548<stdatomic.h>
にもリストされています(以下に再現)が、実装に aがある場合に対応する要件はありません--- それが私の質問の性質です。int16_t
atomic_int16_t
7.17.6 アトミック整数とアドレス型
1 次の表の各行では、原子型名が対応する直接型として宣言されています。
2 これらの型に対する操作のセマンティクスは、7.17.7 で定義されています。
3
atomic_bool
タイプはアトミックブール値を提供します。4
atomic_address
型はアトミックな void * 操作を提供します。加減算の単位は 1 バイトとする。5 注意 アトミック整数型とアドレス型の表現は、対応する通常の型と同じサイズである必要はありません。既存のコードを移植するために必要な労力を軽減するため、可能な限り同じサイズにする必要があります。