0

私は本当にイライラする問題を抱えています。これは私が使用しているバッファ構造です

typedef struct BufferDescriptor {
   char * ca_head ;    /* pointer to the beginning of character array (character buffer) */
   int capacity ;      /* current dynamic memory size (in bytes) allocated to character buffer */       
   char inc_factor;    /* character array increment factor */
   int addc_offset ;    /* the offset (in char elements) to the app-character location */
   int mark_offset ;   /* the offset (in chars elements) to the mark location */
   char r_flag;        /* reallocation flag */
   char mode;          /* operational mode indicator*/

} Buffer ;

上記のコードを変更することはできません。inc_factor は 0 から 255 までの値を取ることができるはずです。

したがって、バッファが作成される関数では、inc_factor が負でないことを確認するために次のことを行います。

Buffer* b_create(int init_capacity, char inc_factor,char o_mode){
    Buffer* buffer = (Buffer*)malloc(sizeof(Buffer));
    buffer->ca_head=(char*)malloc(sizeof(char)*init_capacity);

    buffer->inc_factor=(unsigned char)(inc_factor);

しかし、次の行では負の数が返されます。

printf("inc factor = %d",buffer->inc_factor);

ここで何が間違っていますか?助けてください。

4

4 に答える 4

2

signed変数を値としてフォーマットしているsignedので、変数が 127 を超えると、もちろん負の値が出力されます。unsigned値をsigned変数に格納すると、負の値にラップします。変数の型自体を変更できない場合は、フォーマット方法を変更する必要があります (signed値をunsigned型に型変換してから変数に代入しても意味がありませんsigned)。

printf("inc factor = %u", (unsigned char) buffer->inc_factor); 

または:

printf("inc factor = %d", (unsigned char) buffer->inc_factor); 
于 2012-09-24T21:53:26.287 に答える
2

として値を使用したい場所にキャストする必要がありますunsigned

char value = 255;
printf("%d\n", value);
printf("%d\n", (unsigned char) value);

出力する必要があります:

-1
255
于 2012-09-24T21:49:31.477 に答える
0

charの8ビット値では、バイナリで-1 = 1111 1111、バイナリで255 =11111111です。つまり、それはすべて同じ表現であり、キャスト方法によって異なります。

printf( "inc factor =%d"、buffer-> inc_factor);をキャストしない場合。%dは符号付き小数を出力しようとしているため、-1を出力します。次のように印刷値をキャストする場合:

printf("inc factor = %d", (unsigned char) buffer->inc_factor);

255を出力します。ローカル変数を次のように格納する必要があります。

unsigned char unsigned_char_inc_factor = (unsigned char) buffer->inc_factor;

その後、unsigned_char_inc_factorを使用しました。

于 2012-09-24T22:04:54.183 に答える
0

変数の型を定義するときは、実際には、メモリからのビットをどのように解釈するかをコンパイラに指示しています。したがって、charをunsigned charにキャストしても、メモリ内のビットは変更されませんが、実際には、データが使用される操作にどのように影響するかに影響します。

あなたの場合、あなたはそれをキャストしますが、署名された文字に戻します。データがコンパイラによって読み取られると(ビットは変更されないことに注意してください)、データは符号付き文字として解釈されます。これは、BufferDescriptor.inc_factorのタイプであるためです。

最も簡単な解決策は、使用時にキャストすることです。

printf("inc factor = %d",(unsigned char)buffer->inc_factor);

しかし、ここには深刻で危険なバグがあります。コンパイラーは、タイプ時に引数をスタックにプッシュして、解釈します(この場合、1バイトのunsigned char)。問題は、printf関数が、解釈するように指示した入力時にパラメーターをスタックから削除することです(この場合、%dは通常4バイト整数を意味します)。ご覧のとおり、3バイトが欠落しています。printfはこれらの余分な3バイトを強制的に読み取るため、実際にはメモリから無効なデータを取得します。

これを修正するには、4バイト整数としてスタックにプッシュします。

printf("inc factor = %d",(int)((unsigned char)buffer->inc_factor));

4バイト整数にキャストする前に、unsignedcharとしてキャストしていることに注意してください。これは、コンパイラに最初にビットを符号なしとして解釈させ、次に残りの3バイトをゼロ拡張(符号拡張ではない)させるためです。

これがお役に立てば幸いです=)

于 2012-09-24T22:03:10.343 に答える