Cのcharに格納されたバイナリ値があります。このバイトをCのsigned intに変換したいです。現在、次のようなものがあります。
char a = 0xff;
int b = a;
printf("value of b: %d\n", b);
標準出力の結果は「255」になり、目的の出力は「-1」になります。
Cのcharに格納されたバイナリ値があります。このバイトをCのsigned intに変換したいです。現在、次のようなものがあります。
char a = 0xff;
int b = a;
printf("value of b: %d\n", b);
標準出力の結果は「255」になり、目的の出力は「-1」になります。
C99規格によると、
6.3.1.3 符号付きおよび符号なし整数
整数型の値が_Bool以外の別の整数型に変換される場合、その値が新しい型で表現できる場合、その値は変更されません。
それ以外の場合、新しい型が符号なしの場合、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算することによって、値が変換されます。
それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。
に代入する前にchar
、を にキャストする必要があります。これは、取ることができる任意の値が として直接表現できるためです。signed char
int
char
int
#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オブジェクトに格納されている場合、結果の値は実装定義ですが、その型で表現できる値の範囲内でなければなりません。
...
char、signed char、およびunsigned charの 3 つの型をまとめて文字型と呼びます。実装では、 char がsigned charまたはunsigned charと同じ範囲、表現、および動作を持つように定義する必要があります。
交換:
char a = 0xff
に
signed char a = 0xff; // or more explicit: = -1
printf
プリントを持っています-1
。
のタイプを変更したくない場合はa
、 @veer がコメントに追加したように、その値を に割り当てる前に単純にキャストa
でき(signed char)
ますb
。
どちらの場合も、この整数変換は実装定義ですが、これは一般的に見られる実装定義の動作であることに注意してください。
あなたは最初からすでに間違っています:
char a = 0xff;
あなたchar
がsigned
想定しているように見える場合、ここではすでに範囲外の値を持っています。0xFF
値は符号なしの量です255
。char
符号付きの数値として表示したい場合は、それsigned char
に割り当て-1
て使用します。それをビットパターンとして見たい場合は、それを使用unsigned char
して割り当て0xFF
ます。の初期化は、int
あなたが期待することを行います。
char
、signed char
およびunsigned char
は、標準の 3 つの異なるタイプの定義によるものです。char
人間が読めるものを印刷して、文字に予約します。