Rumah > Artikel > pembangunan bahagian belakang > Mengapa 1 >> 32 Menghasilkan 1, Tetapi 1 (uint64_t) >> 32 Menghasilkan 0?
> 32 Keputusan dalam 1, Tetapi 1 (uint64_t) >> 32 Keputusan dalam 0? " />
Masalah:
Dalam program C, anjakan kanan operator mempamerkan gelagat pelik:
<code class="cpp">int foo(int a, int b) { return a >> b; } int main() { std::cout << "foo(1, 32): " << foo(1, 32) << std::endl; }
Output ialah 1, yang tidak dijangka kerana secara teorinya hasilnya harus 0. Selain itu, tingkah laku berbeza berdasarkan jenis hujah:
<code class="cpp">int bar(uint64_t a, int b) { return a >> b; } std::cout << "bar(1, 32): " << bar(1, 32) << std::endl; // Outputs 0
Penjelasan:
Tingkah laku ini berpunca daripada fakta bahawa operator anjakan kanan berfungsi secara berbeza bergantung pada lebar jenis data asas Untuk integer 32-bit (int dalam kes ini), the anjakan kanan ialah anjakan "logik", bermakna ia mengisi bit kosong dengan sifar tanpa mengira nilai b Oleh itu, 1 >> 32 menilai kepada 1, kerana peralihan lebih daripada bilangan bit tidak mempunyai kesan.
Walau bagaimanapun, untuk integer 64-bit (uint64_t), anjakan kanan ialah anjakan "aritmetik", bermakna ia mengisi bit yang kosong dengan bit tanda yang sama dengan operan memandangkan nilai 1 mempunyai bit tanda positif , hasil daripada 1 >> 32 ialah 0.
Pengoptimuman Pengkompil:
Selain itu, pengoptimuman pengkompil memainkan peranan. Ungkapan 1 >> 32 ialah pemalar masa kompilasi, yang membolehkan pengkompil melipatnya menjadi 0 semasa penyusunan. Ini berbeza daripada penilaian dinamik foo(1, 32) dalam fungsi.
Isu Mudah Alih:
Adalah penting untuk ambil perhatian bahawa tingkah laku ini bergantung kepada seni bina. Pada sesetengah seni bina, seperti ARM, anjakan kanan logik dilaksanakan secara berbeza daripada pada CPU x86/x86-64. Akibatnya, mengalihkan integer 32-bit dengan nilai yang lebih besar daripada atau sama dengan 32 mungkin menghasilkan hasil yang tidak mudah alih.
Atas ialah kandungan terperinci Mengapa 1 >> 32 Menghasilkan 1, Tetapi 1 (uint64_t) >> 32 Menghasilkan 0?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!