2016-10-14 10 views
0

uint64_tを左シフトすると期待値が出力されず、理由を知りたいと思っています。私が得たのは、4つの最上位バイトがゼロになっていると予想される結果です。 私はDebian Jessie 64bit上でx86_64 CPU(Intel i7 3770k)を使用しています。これは、同じ動作を再現するテストプログラムです。uint64_tを左シフトすると、最も重要なdwordがゼロになります

#include <stdio.h> 
#include <stdint.h> 

int main(int argc, char * * argv) 
{ 
    uint64_t var = 0xDEFEC8ED; 

    printf("%016x\n", var << 24); 

    return 0; 
} 

OUTPUT 00defec8ed000000 // expected 00000000ed000000 // obtained

+2

警告が有効になっているコンパイラの多くは、問題を報告します。時間を節約し、すべてのコンパイラの警告を有効にします。 – chux

答えて

3

それはuint64_tであり、あなたがするので、これらのタイプを印刷するための特別のマクロがあるので、完全には正しくないprintf

#include <stdio.h> 
#include <stdint.h> 

int main(int argc, char * * argv) 
{ 
    uint64_t var = 0xDEFEC8ED; 

    printf("%016llx\n", (unsigned long long)(var << 24)); 

    return 0; 
} 

ための異なるタイプを必要としますC99:

#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 

int main(int argc, char * * argv) 
{ 
    uint64_t var = 0xDEFEC8ED; 

    printf("%016" PRIX64 "\n", var << 24); 

    return 0; 
} 

しかし、あなたが持っていてもいなくてもかまいません。

+0

ありがとう、それは動作し、私が知らなかったそれらの特別なマクロについて言及したことで受け入れられました。 – pr0gma

1

置き換えますと

printf("%016x\n", var << 24); 

printf("%016llx\n", (var << 24)); 

をまた、uint_64またはuint64_tをですか?

+0

それはちょうどタイプミスで、編集しました、それを指摘してくれてありがとう。 – pr0gma

関連する問題