Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-10-26 12:17:02
asal
1105 orang telah melayarinya

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; }
Salin selepas log masuk

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
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan