8

符号なし数値 (unsigned short、int、long) について私が知っていることは、正の数値のみが含まれているということですが、次の単純なプログラムは負の数値を unsigned int に正常に割り当てました。

  1 /*
  2  * =====================================================================================
  3  *
  4  *       Filename:  prog4.c
  5  *
  6  * =====================================================================================
  7  */
  8 
  9 #include <stdio.h>
 10 
 11 int main(void){
 12 
 13     int v1 =0, v2=0;
 14     unsigned int sum;
 15     
 16     v1 = 10;
 17     v2 = 20;
 18     
 19     sum = v1 - v2;
 20     
 21     printf("The subtraction of %i from %i is %i \n" , v1, v2, sum);
 22     
 23     return 0;
 24 }

出力は次のとおりです。 The subtraction of 10 from 20 is -10

4

4 に答える 4

22

%i符号付き整数の書式指定子です。%u符号なし整数を出力するために使用する必要があります。

于 2010-05-11T02:59:15.480 に答える
8

printf場合、%iフォーマットは を出力しsigned intます。%uを出力するために使用しますunsigned int。これは、C プログラミングを始めるときによくある問題です。あなたの質問に答えるために、 の結果v1 - v2は -10 ですがsumですunsigned int。したがって、実際の答えはおそらく 4294967286 (2 32 - 10) のようなものです。を使用すると何が得られるかを確認してくださいThe subtraction of %i from %i is %u \n。:)

于 2010-05-11T03:03:51.990 に答える
6

符号付き int と符号なし int はメモリ内で同じサイズです。それらの唯一の違いは、それらをどのように解釈するかです。符号付きの値は、2 の補数表現を使用します。

0xFFFFFFFF を 4 バイトのメモリ ロケーションに配置し、そこにある値は何ですか? これを signed int として解釈すると -1 になりますが、unsigned int として解釈すると、値は 4294967295 になります。どちらにしても、同じビット パターンです。違いは、与える意味です。

unsigned int に 10 ~ 20 を代入すると、-10 の値が計算されます (C はオーバーフローまたはアンダーフローのチェックを行いません)。これは 0xFFFFFFF6 のビット パターンです。これは、signed int では -10、unsigned int では 4294967286 を意味します。整数。次に、(%i を使用して) コンパイラに signed int を出力するように指示すると、コンパイラはそのビット パターンを signed int として解釈し、-10 を出力します。コンパイラに (%u を使用して) unsigned int を出力するように指示した場合は、そのビット パターンを符号なしと解釈し、4294967286 を出力します。

于 2010-05-11T23:48:45.307 に答える
1

sum に格納されている unsigned int 値は、printf %iでは符号付き 10 進整数のように扱われるためです。

于 2010-05-11T03:01:59.657 に答える