1

私はCでビットシフト作業を行っており、unsignedcharを読み込んでいます。これらの変数で使用するすべての関数は、入力としてunsigned charを取り込む必要がありますか、それともunsignedとして値をロードしたため、最初のビットが自動的に正に保たれますか?

基本的に私はする必要がありますか:

int Test1(unsigned char input1)
{
...
}

すべてのために、または意志:

int Test2(char input2)
{
...
}

十分ですか?ありがとう。

4

3 に答える 3

2

int Test2(char input2)動作しない可能性があります。最大unsigned charは最大よりも大きいsigned char(範囲内で最大の正の整数)。

だが!

unsigned charとは両方ともsigned char同じサイズなので、それを読み取るかsigned charunsigned charメモリに保存されるものは同じです。それらにアクセスするときの解釈のみが異なります。

またchar var、それがであるという意味ではありませんsigned char。実際にはコンパイラフラグに依存します。ここを読んでください

于 2012-11-19T15:18:45.250 に答える
1

値は変更されませんが、解釈が異なる可能性があるため、関数内で何をしたいかによって異なります。たとえば、次のようになります。

unsigned char c = 255;

void Test1(unsigned char c)
{
    printf("%d\n", (c>100)); //prints 1
    printf("%d\n",  (unsigned char)c); //prints 255
}

void Test2(char c)
{
    printf("%d\n", (c>100)); //prints 0
    printf("%d\n",  (unsigned char)c); //prints 255
}
于 2012-11-19T15:22:44.443 に答える
0

可能な最大unsigned char値は、可能な最大の符号付き値よりも大きくなりcharます(符号には、事実上1ビット相当の情報が必要になるため)。

したがって、最初の関数の一部の有効な値は、2番目の関数に渡されたときにunsigned char符号付きとして表現できません。char彼らがどういうわけか切り捨てられるのか、それともネガティブになるのかは本当に重要ですか?彼らは明らかに何らかの形で損傷を受けるでしょう。

何らかの理由で意図的にタイプを強制する場合を除いて、タイプを同じに保ちます(たとえば、unsigned charがとして表現可能であることを確認しますchar)。もちろん、内容について特別な知識がある場合は例外となる場合があります。

于 2012-11-19T15:18:15.653 に答える