Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa 1 >> 32 Menghasilkan 1, Tetapi 1 (uint64_t) >> 32 Menghasilkan 0?

Mengapa 1 >> 32 Menghasilkan 1, Tetapi 1 (uint64_t) >> 32 Menghasilkan 0?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 12:17:021018semak imbas

Why Does 1 >> 32 Keputusan dalam 1, Tetapi 1 (uint64_t) >> 32 Keputusan dalam 0? 
> 32 Keputusan dalam 1, Tetapi 1 (uint64_t) >> 32 Keputusan dalam 0? " />

Gelagat Ingin Tahu Operator Anjakan Kanan: 1 >> 32

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn