0

私が見ているこのコードには、このようなことが起こっているのを見る場所がたくさんあります。

char *functionName(char *passedVariable)
{
    unsigned char *newVariable = (char* ) passedVariable;

なぜこれが行われているのですか?2つを切り替えると問題が発生する可能性があることを知っているので、私は常にsigned / unsignedの使用に一貫性を持たせるようにしていますが、この開発者は気にしていないようです。

4

5 に答える 5

1

ポインタ型の変更は実際には問題ではありません。このアドレスは引き続き有効です。ただし、ポイントされたデータを符号付き/符号なしとして解釈すると、符号付きデータが負の場合にのみ違いが生じます。したがって、あなたの例でcharは、 が常に正であれば問題ありませんが、そうでない場合は問題ありません。

署名付き/署名なしのキャストの例:

char c = 42;
char d = -42;
unsigned char cu = c;
unsigned char du = d;

printf("c  %d\n", c);
printf("cu %d\n", cu);
printf("d  %d\n", d);
printf("du %d\n", du);

出力:

c  42
cu 42
d  -42
du 214
于 2012-06-20T15:44:16.060 に答える
0

たとえば、符号なしバイトで構成される UTF-8 文字列であり、そのように手動で処理することが望ましい場合がありますが、多くのプラットフォームで符号付き char を想定している printf に安全に渡すことができるため、どこかにキャストする必要があります。警告を回避します。

于 2012-06-20T15:37:24.413 に答える
0

あなたの例のように見える文字列の場合、それはおそらく問題ではありません。ASCII 値は 0 から 127 までしかありません。つまり、符号付き文字でも符号なし文字でも問題なく収まります。さらに、非装飾の署名charは実装定義です (したがって、signedキーワードが存在します)。符号なしの型の場合char、例には符号変換がまったくありません。

一般に、例のキャストのタイプは、さまざまなコーディング スタイルを使用したり、char. このような場合、常に一貫性を保つことができるとは限りませんが、キャストして文字列ポインタの符号を変更しても、問題が発生する可能性はほとんどありません。

于 2012-06-20T15:37:39.917 に答える
0

char文字は本質的に符号付きの値ではなく、C が標準化されたとき、一部の実装ではそれらを符号付きとして扱い、一部の実装ではそうではなかったため、 の符号の有無は C 言語では指定されていません。そのため、常に安全にまたはに変換charできます。前者は一般的ではありませんが、後者は char を配列インデックスまたは ctype.hおよび関数の引数として使用するためです。しかし、ポインターを使用する実際のコードを見ないと、なぜポインターが使用されているのかを確認することはできません。signed charunsigned charis...to...unsigned char*

于 2012-06-20T16:18:08.040 に答える
0

ポインタの場合、符号付きと符号なしの文字がメモリ内で同じサイズである限り、これは単なるアドレスです。unsigned char * は、任意のメモリアドレスに対して最も理にかなっています。これが、最も純粋なメモリ関数が引数としてそれを取る理由です。

于 2012-06-20T15:38:38.647 に答える