Peraturan Promosi dengan Operator Mengendalikan Integer Bertanda dan Tidak Bertanda
Apabila berurusan dengan pengendali binari yang melibatkan tandatangan berbeza antara operan mereka, peraturan promosi yang digariskan dalam C Standard mula bermain. Peraturan ini menentukan jenis operasi yang terhasil dan cara operan ditukar.
Khususnya, "penukaran aritmetik biasa" digunakan di sini (§5/9). Penukaran ini ditarafkan dalam keutamaan menurun:
- Berganda panjang (jika ada)
- Berganda
- Apung
- Promosi bersepadu (tukar pendek/int /long long ke int/long/long long)
- Unsigned long (jika present)
- Int panjang jika panjang boleh mewakili semua nilai int yang tidak ditandatangani, atau int panjang yang tidak ditandatangani sebaliknya
- Panjang (jika ada)
- Tidak ditandatangani (jika ada)
Menggunakan peraturan ini pada dua senario dibentangkan:
Senario 1:
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
Salin selepas log masuk
- maks ditandatangani int, satu tidak ditandatangani int
- Promosi bersepadu berlaku, mengakibatkan maks sebagai int
- Memandangkan int yang tidak ditandatangani diberi kedudukan lebih tinggi, jenis hasil adalah unsigned int
- Hasil: unsigned overflow to 2147483648
Senario 2:
unsigned int us = 42;
int neg = -43;
int result = us + neg;
Salin selepas log masuk
- us is unsigned int ditandatangani int
- Promosi bersepadu berlaku, menyebabkan kami sebagai int yang tidak ditandatangani, tolak sebagai int
- Memandangkan int yang tidak ditandatangani berada di kedudukan lebih tinggi, jenis hasil adalah int yang tidak ditandatangani
- Walau bagaimanapun, nilai daripada kami neg (-1) tidak boleh diwakili dalam int
- Keputusan: Tingkah laku yang ditentukan pelaksanaan, berkemungkinan kembali -1 atau bergantung pada platform
Atas ialah kandungan terperinci Bagaimanakah Peraturan Promosi C Mengendalikan Operasi Perduaan dengan Integer Bertanda dan Tidak Bertanda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!