4

Cのcharに格納されたバイナリ値があります。このバイトをCのsigned intに変換したいです。現在、次のようなものがあります。

char a = 0xff;
int b = a; 
printf("value of b: %d\n", b);

標準出力の結果は「255」になり、目的の出力は「-1」になります。

4

3 に答える 3

5

C99規格によると、

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

整数型の値が_Bool以外の別の整数型に変換される場合、その値が新しい型で表現できる場合、その値は変更されません。

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

それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。


に代入する前にchar、を にキャストする必要があります。これは、取ることができる任意の値が として直接表現できるためです。signed charintcharint

#include <stdio.h>

int main(void) {
  char a = 0xff;
  int b = (signed char) a;
  printf("value of b: %d\n", b);
  return 0;
}

簡単にテストすると、ここで機能することがわかります。

C:\dev\scrap>gcc -std=c99 -oprint-b print-b.c

C:\dev\scrap>print-b
value of b: -1

charは、符号付きまたは符号なしのどちらで扱われるかについて、C99 標準では定義されていないことに注意してください。

6.2.5 タイプ

char型として宣言されたオブジェクトは、基本実行文字セットの任意のメンバーを格納するのに十分な大きさです。基本実行文字セットのメンバーが charオブジェクトに格納されている場合、その値は正であることが保証されます。他の文字がcharオブジェクトに格納されている場合、結果の値は実装定義ですが、その型で表現できる値の範囲内でなければなりません。

...

charsigned char、およびunsigned charの 3 つの型をまとめて文字型と呼びます。実装では、 char がsigned charまたはunsigned charと同じ範囲、表現、および動作を持つように定義する必要があります。

于 2012-08-05T20:09:37.393 に答える
4

交換:

char a = 0xff

signed char a = 0xff;  // or more explicit: = -1

printfプリントを持っています-1

のタイプを変更したくない場合はa、 @veer がコメントに追加したように、その値を に割り当てる前に単純にキャストaでき(signed char)ますb

どちらの場合も、この整数変換は実装定義ですが、これは一般的に見られる実装定義の動作であることに注意してください。

于 2012-08-05T20:07:03.560 に答える
1

あなたは最初からすでに間違っています:

char a = 0xff;

あなたcharsigned想定しているように見える場合、ここではすでに範囲外の値を持っています。0xFF値は符号なしの量です255char符号付きの数値として表示したい場合は、それsigned charに割り当て-1て使用します。それをビットパターンとして見たい場合は、それを使用unsigned charして割り当て0xFFます。の初期化は、intあなたが期待することを行います。

charsigned charおよびunsigned charは、標準の 3 つの異なるタイプの定義によるものです。char人間が読めるものを印刷して、文字に予約します。

于 2012-08-05T20:18:50.743 に答える