Saya sarankan Anda untuk melakukannya persis seperti yang Anda tunjukkan, karena ini adalah yang paling mudah. Inisialisasi -1
yang akan selalu bekerja , terlepas dari representasi tanda yang sebenarnya, sementara ~
kadang-kadang akan memiliki perilaku yang mengejutkan karena Anda harus memiliki jenis operan yang tepat. Hanya dengan begitu Anda akan mendapatkan nilai jenis yang paling tinggi unsigned
.
Untuk contoh kemungkinan kejutan, pertimbangkan yang ini:
unsigned long a = ~0u;
Itu tidak serta merta menyimpan pola dengan semua bit 1 menjadi a
. Tapi itu pertama-tama akan membuat pola dengan semua bit 1 dalam unsigned int
, dan kemudian menetapkannya a
. Apa yang terjadi ketika unsigned long
memiliki lebih banyak bit adalah bahwa tidak semua itu adalah 1.
Dan pertimbangkan yang ini, yang akan gagal pada representasi komplemen bukan-dua:
unsigned int a = ~0; // Should have done ~0u !
Alasan untuk itu adalah bahwa ~0
harus membalikkan semua bit. Melawan yang akan menghasilkan -1
pada mesin pelengkap dua (yang merupakan nilai yang kita butuhkan!), Tetapi tidak akan menghasilkan -1
representasi lain. Pada mesin pelengkap seseorang, hasilnya nol. Jadi, pada mesin komplemen seseorang, yang di atas akan menginisialisasi a
ke nol.
Hal yang harus Anda pahami adalah itu semua tentang nilai - bukan bit. Variabel diinisialisasi dengan nilai . Jika dalam initializer Anda memodifikasi bit variabel yang digunakan untuk inisialisasi, nilai akan dihasilkan sesuai dengan bit tersebut. Nilai yang Anda butuhkan, untuk menginisialisasi a
ke nilai setinggi mungkin, adalah -1
atau UINT_MAX
. Yang kedua akan tergantung pada jenis a
- Anda harus menggunakan ULONG_MAX
untuk unsigned long
. Namun, yang pertama tidak akan tergantung pada jenisnya, dan itu cara yang bagus untuk mendapatkan nilai tertinggi.
Kita tidak berbicara tentang apakah -1
semua bit satu (tidak selalu demikian). Dan kita tidak berbicara tentang apakah ~0
semuanya memiliki bit (tentu saja).
Tetapi yang kita bicarakan adalah apa hasil dari flags
variabel yang diinisialisasi . Dan untuk itu, hanya-1
akan bekerja dengan setiap jenis dan mesin.