1

Cでプログラミングを始めてからしばらく経ちますが、いまだに戸惑っていunsignedます。このコードをコンパイルした場合:

#include <stdio.h>

int main(int argc, char **argv)
{
    unsigned int x = -1;

    return 0;
}

gcc と VC++ の両方で、 で負の数を使用することに関するエラーや警告さえも発生しませんunsigned

私の質問は、unsigned内部的な仕事をしているのか、それともこの値が負であってはならないというプログラマーへの単なるヒントですか?

4

7 に答える 7

3

それは単なるヒントではありません。次の 2 つのスニペットは、異なる動作をする必要があります。

符号付き整数:

int x = -1;
printf("%d\n", x > 0);  // prints 0

符号なし整数:

unsigned int x = -1;
printf("%d\n", x > 0);  // prints 1

そして、署名が重要な例をさらに 5 つ思い付くことができます。たとえば、>>演算子で右にシフトします。

于 2012-09-02T16:27:03.627 に答える
2

unsignedstaticexternconstまたはのような修飾子ではありませんinline。型の一部です。

intunsigned int2 つの完全に異なるタイプです。unsigned int負の数を保持できるは決して見つかりません。intsigned intがまったく同じ型であることにも注意してください。については少し話が違いcharますが、それは別の機会に譲ります。

-1符号なし整数への割り当ては、保持できる最大値に設定するための一般的なトリックです。

于 2012-09-02T16:42:20.223 に答える
2

-Wsign-conversionで警告を表示するために使用しますgcc

gcc4.7.1 では、はまたは-Wsign-conversionの一部ではあり-Wallません -Wextra

また、C 標準では、この初期化に警告が必要ないことにも注意してください。

于 2012-09-02T16:28:12.567 に答える
0

unsigned整数のオーバーフロー、比較、およびビットごとのシフトの動作に影響を与える可能性があります。ネガティブになってはいけないというのは、単なる「ヒント」ではありません。

于 2012-09-02T16:29:11.943 に答える
0

((unsigned int) -1)負の値から符号なしの値への変換は、モジュロ演算によって行われることが保証されているため、(UINT_MAX)( )と同等です。<limits.h>

C11 § 6.3.1.3 符号付きおよび符号なし整数

2 それ以外の場合、新しい型が の場合unsigned、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算することによって、値が変換されます。

于 2012-09-02T18:36:09.860 に答える
0

次のようにして、gcc で警告を有効にしてみてください。gcc -Wall -o out input.c

unsigned intと normalのもう 1 つの違いint: int4 バイトを使用した範囲: –2,147,483,648 から 2,147,483,647、4 バイトを使用したunsigned範囲: 0 から 4,294,967,295 。符号 (最上位ビット) に関する情報を保存する必要がないため、より大きな値を割り当てることができ、アプリケーションは適切に動作します。

于 2012-09-02T16:25:59.993 に答える
-1

mul乗算(符号なし) および(符号あり)などの計算用の内部 (マシンレベル) 命令には、符号付きバージョンと符号なしバージョンの両方がありますimul。コンパイラは、変数を符号なしまたは符号付きとして宣言すると、それらを選択します。

于 2012-09-02T16:28:00.277 に答える