問題タブ [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.

0 投票する
3 に答える
1312 参照

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 ## Ufalse-1 < UINT8_C(0)

3 つの定義はすべて標準に従って正しいですか? これら 3 つの実装の間に (負の定数の処理以外に) 違いはありますか?

0 投票する
3 に答える
1728 参照

c - uint32_t を int32_t にキャストして後で比較する

1 つが unsigned int32 で、もう 1 つが signed int32 である 2 つの int を比較する方法を理解するのに苦労しています。この単純なプログラムを考えてみましょう:

この場合、a1は符号付き 32 ビット整数の範囲を超えているため、デバッグ中に確認したように、キャストされた後は にb1等しくなり-1ます。ただし、これらの値は明らかに同じではありませんが、それでも「等しい」と出力されます。何が原因ですか?

0 投票する
2 に答える
184 参照

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_Atomicstdint.h uint_least16_tuint_fast16_tatomic_uint16_t


N1548 ドラフトの背景情報については、次のとおりです。

7.18.1.1 正確な幅の整数型

1 typedef 名intN_tは、幅 N、パディング ビットなし、および 2 の補数表現を持つ符号付き整数型を指定します。したがって、int8_t正確に 8 ビット幅の符号付き整数型を示します。

2 typedef 名uintN_tは、幅 N でパディング ビットのない符号なし整数型を指定します。したがって、uint24_t正確に 24 ビット幅の符号なし整数型を示します。

3 これらのタイプはオプションです。ただし、実装が幅が 8、16、32、または 64 ビットで、パディング ビットがなく、2 の補数表現を持つ (符号付きの型の場合) 整数型を提供する場合、対応する typedef 名を定義する必要があります。

7.18.1.2 最小幅の整数型

1 typedef 名int_leastN_tは、幅が少なくとも N の符号付き整数型を指定します。これより小さなサイズの符号付き整数型が少なくとも指定された幅を持つことはありません。したがって、int_least32_t少なくとも 32 ビット幅の符号付き整数型を示します。

2 typedef 名uint_leastN_tは、少なくとも N の幅を持つ符号なし整数型を指定します。これより小さなサイズの符号なし整数型が少なくとも指定された幅を持つことはありません。したがって、uint_least16_t少なくとも 16 ビット幅の符号なし整数型を示します。

3 次のタイプが必要です。

このフォームの他のタイプはすべてオプションです。

int_fast(など、 N _t/ uint_fastN_tタイプなどを含める)

段落3で強調する価値があります。

ただし、実装が幅が 8、16、32、または 64 ビットで、パディング ビットがなく、2 の補数表現を持つ (符号付きの型の場合) 整数型を提供する場合、対応する typedef 名を定義する必要があります。

これは、たとえば、2 の補数表現の 16 ビット整数として実装されるintorのような型がある場合、実装で定義する必要があることを意味します。shortint16_t

atomic_型はN1548<stdatomic.h>にもリストされています(以下に再現)が、実装に aがある場合に対応する要件はありません--- それが私の質問の性質です。int16_tatomic_int16_t

7.17.6 アトミック整数とアドレス型

1 次の表の各行では、原子型名が対応する直接型として宣言されています。

2 これらの型に対する操作のセマンティクスは、7.17.7 で定義されています。

3atomic_boolタイプはアトミックブール値を提供します。

4atomic_address型はアトミックな void * 操作を提供します。加減算の単位は 1 バイトとする。

5 注意 アトミック整数型とアドレス型の表現は、対応する通常の型と同じサイズである必要はありません。既存のコードを移植するために必要な労力を軽減するため、可能な限り同じサイズにする必要があります。