0

この状況で「n」に何が起こっているのか誰か説明してもらえますか?

main.c

unsigned long temp0;
PLLSYS0_FWD_DIV_A_DECODE(n);

main.h

#define PLLSYS0_FWD_DIV_A_DECODE(n) ((((unsigned long)(n))>>8)& 0x0000000f)

n が 8 ビット シフトされ、0x0000000f と AND 演算されていることを理解しています。(unsigned long)(n) は実際に何をするのでしょうか?

#include <stdio.h>

int main(void)
{
    unsigned long test1 = 1;
    printf("test1 = %d \n", test1);
    printf("(unsigned long)test1 = %d \n", (unsigned long)(test1));

return 0;
}

出力:

test1 = 1 
(unsigned long)test1 = 1
4

5 に答える 5

2

test1あなたのコード例では、キャストはすでに であるためあまり意味がありませんがunsigned long、マクロがunsigned charなどの別の型で使用されている場合は意味があります.

また、 in を使用%luprintf て印刷する必要がありますunsigned long

printf("(unsigned long)test1 = %lu\n", (unsigned long)(test1));
//                              ^^
于 2013-10-04T17:26:53.573 に答える
1

この状況で「n」に何が起こっているのか誰か説明してもらえますか?

にキャストnしていunsigned longます。

(unsigned long)(n) は実際に何をするのでしょうか?

に昇格nunsigned longます。

于 2013-10-04T17:23:48.077 に答える
1

のサイズになるように広げますunsigned long。これを acharで呼び出して、右に 8 ビットシフトした場合、anding は同じように機能しないと想像してください。

また、署名されていない理由については、これを見つけました(右シフト演算子の下を見てください)。どうやら unsigned は、シフトされた位置ごとに左端のビットがゼロに置き換えられる論理シフトを強制します。一方、シフトされた符号付きの値は、左端のビットがドロップされた右端のビットに置き換えられる算術シフトを実行します。

例:

11000011 ( unsigned, shifted to the right by 1 )
01100001

11000011 ( signed, shifted to the right by 1 )
11100001
于 2013-10-04T17:24:02.013 に答える
0

入力のキャストは、ビット シフトと AND 処理の前に行うすべてです。if 演算の順序と演算子の優先順位に注意してください。それはかなり醜いです。

しかし、彼らは符号ビットを打つことを避けているようで、関数の代わりにこれを行うことで、n の型チェックはありません。

それはただ醜いです。

より良い形式は、入力型チェックを持つクリーンな clear 関数を持つことです。

于 2013-10-04T17:28:35.820 に答える
0

これによりn、適切なサイズ (ビット単位) が確保され、最も重要なこととして、符号なしとして扱われます。シフト演算子は符号拡張を実行するため、数値が符号付きで負の場合、拡張はゼロではなく 1 で行われます。これは、シフトされた負の数は常に負の数になることを意味します。

例えば:

int main()
{
        long i = -1;
        long x, y;

        x = ((unsigned long)i) >> 8;
        y = i >> 8;

        printf("%ld %ld\n", x, y);
}

私のマシンでは、次のように出力されます。

72057594037927935 -1

の符号拡張のためy、数値は引き続き -1 です。

于 2013-10-04T17:33:14.727 に答える