95909


次の64bit変数 `unsigned __int64` にビット演算を行うプログラムについて質問です。  
XORで初期化してから6番目のビット反転 `val |= (1<<5);` を行うと、37 番目も一緒に反転するのはなぜなのでしょうか。  
コンパイラとして MSCV や bcc32 を使っても同じ挙動でした。OS は Windows10 64bit です。  
32bit変数 `unsigned __int32`
では、期待した挙動になるのですが、64bit変数で意図した動作にならず困っています。どうぞよろしくお願いします。

[code]

    #include <stdio.h>
    
    void b_printf( unsigned __int64 x )
    {
        int i;
        
        for( i=0; i<64; i++ ){
            ( x & (1<<i) ) ? printf( "1" ) : printf( "0" );
            if( (i+1)%10 == 0 ) printf( " " );
            }
        printf( "\n" );
    }
    
    int main( void )
    {
        unsigned __int64 val;
        
        val ^= val;
        b_printf( val );
        
        val |= (1<<5);
        b_printf( val );
        
        return 0;
    }
    
[/code]

実行結果

[code]

    0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000
    0000010000 0000000000 0000000000 0000000100 0000000000 0000000000 0000
    
[/code]


CC BY-SA 4.0
2023-08-10T03:45:04.917
95908
2023-08-10T04:27:43.933
2023-08-10T03:53:28.940
57263
57263
question
c アルゴリズム
符号なし64bit変数のビット演算の挙動がおかしい


>
[code]

>     ( x & (1<<i) ) ? printf( "1" ) : printf( "0" );
>  
[/code]

こんな感じにすべきなのでは？

[code]

    ( x & ((__int64)1 << i) ) ? printf( "1" ) : printf( "0" );
    
[/code]


CC BY-SA 4.0
2023-08-10T04:04:39.747
95909
2023-08-10T04:27:43.933
2023-08-10T04:27:43.933
3060
52236
95908
answer