Saya tahu bahwa nilai integer 0
dan -0
pada dasarnya sama. Tapi, saya bertanya-tanya apakah mungkin untuk membedakan keduanya.
Misalnya, bagaimana saya mengetahui jika suatu variabel telah ditetapkan -0
?
bool IsNegative(int num)
{
// How ?
}
int num = -0;
int additinon = 5;
num += (IsNegative(num)) ? -addition : addition;
Apakah nilai yang -0
disimpan dalam memori sama persis dengan 0
?
c++
int
zero
negative-number
Filip Minx
sumber
sumber
int
yang direpresentasikan dalam komplemen 2 (sejauh ini paling sering ditemui),0
dan-0
memiliki representasi bitwise yang identik.int
. Lihat pengkodean komplemen Ones .Jawaban:
Itu tergantung pada mesin yang Anda targetkan.
Pada mesin yang menggunakan representasi komplemen 2 untuk bilangan bulat, tidak ada perbedaan pada tingkat bit antara
0
dan-0
(keduanya memiliki representasi yang sama)Jika mesin Anda menggunakan pelengkap , Anda pasti bisa
Jelas kita berbicara tentang penggunaan dukungan asli , prosesor seri x86 memiliki dukungan asli untuk representasi komplemen dua nomor yang ditandatangani. Menggunakan representasi lain pasti mungkin tetapi mungkin kurang efisien dan membutuhkan lebih banyak instruksi.
(Seperti yang juga dicatat JerryCoffin: bahkan jika komplemen seseorang telah dianggap sebagian besar karena alasan historis, representasi besaran yang ditandatangani masih cukup umum dan memang memiliki representasi terpisah untuk nol negatif dan positif)
sumber
0
dan-0
yang berbeda ? Sejujurnya saya akan mengharapkannya untuk berperilaku lebih seperti mengizinkan representasi dua bit dengan nilai yang sama, dan program Anda dapat menggunakan yang mana pun rasanya.-0
, yaitu hasil penerapan-
operator unary ke konstanta integer0
, adalah representasi nol negatif. Terlepas dari representasi, standar tidak pernah mengatakan0
dan-0
merupakan nilai yang berbeda secara matematis, hanya saja mungkin ada pola bit negatif-nol. Jika ada, itu masih mewakili nilai numerik yang sama, 0.Untuk
int
(dalam representasi "komplemen 2" yang hampir universal), representasi dari0
dan-0
adalah sama. (Mereka dapat berbeda untuk representasi angka lainnya, misalnya, titik mengambang IEEE 754.)sumber
Mari kita mulai dengan merepresentasikan 0 dalam komplemen 2 (tentu saja ada banyak sistem dan representasi lain, di sini saya merujuk yang spesifik ini), dengan asumsi 8-bit, nol adalah:
Sekarang mari balik semua bit dan tambahkan 1 untuk mendapatkan komplemen 2:
kami dapatkan
0000 0000
, dan itu juga representasi dari -0.Tetapi perhatikan bahwa dalam pelengkap 1, tanda 0 adalah 0000 0000, tetapi -0 adalah 1111 1111.
sumber
Saya telah memutuskan untuk membiarkan jawaban ini karena implementasi C dan C ++ biasanya terkait erat, tetapi pada kenyataannya tidak tunduk pada standar C seperti yang saya kira. Intinya tetap bahwa standar C ++ tidak menentukan apa yang terjadi untuk kasus seperti ini. Juga relevan bahwa representasi non-dua-komplemen sangat langka di dunia nyata, dan bahkan jika memang ada, mereka sering menyembunyikan perbedaan dalam banyak kasus daripada memaparkannya sebagai sesuatu yang dapat diharapkan dengan mudah ditemukan seseorang.
Perilaku nol negatif dalam representasi integer di mana mereka ada tidak didefinisikan secara ketat dalam standar C ++ seperti dalam standar C. Namun, ia mengutip standar C (ISO / IEC 9899: 1999) sebagai referensi normatif di tingkat atas [1.2].
Dalam standar C [6.2.6.2], nol negatif hanya dapat menjadi hasil dari operasi bitwise, atau operasi di mana sudah ada nol negatif (misalnya, mengalikan atau membagi nol negatif dengan nilai, atau menambahkan nol negatif ke nol) - menerapkan operator minus unary ke nilai nol normal, seperti dalam contoh Anda, oleh karena itu dijamin menghasilkan nol normal.
Bahkan dalam kasus yang dapat menghasilkan nol negatif, tidak ada jaminan bahwa mereka akan melakukannya, bahkan pada sistem yang mendukung nol negatif:
Oleh karena itu, kami dapat menyimpulkan: tidak, tidak ada cara yang dapat diandalkan untuk mendeteksi kasus ini. Bahkan jika bukan karena fakta bahwa representasi non-dua-komplemen sangat tidak umum dalam sistem komputer modern.
Standar C ++, pada bagiannya, tidak menyebutkan istilah "nol negatif", dan hanya memiliki sedikit diskusi tentang rincian besaran yang ditandatangani dan representasi pelengkap seseorang, kecuali untuk dicatat [3.9.1 para 7] bahwa mereka diperbolehkan.
sumber
_Bool
atau_Complex
atau penginisialisasi yang ditunjuk atau literal gabungan dalam C ++). Standar C ++ tahu bagaimana menggabungkan standar C ketika ia ingin - misalnya, [basic.fundamental] / p3: "Tipe bilangan bulat bertanda dan tak bertanda harus memenuhi batasan yang diberikan dalam standar C, bagian 5.2.4.2.1."Jika mesin Anda memiliki representasi berbeda untuk
-0
dan+0
, makamemcmp
akan dapat membedakannya.Jika bit padding ada, sebenarnya mungkin ada beberapa representasi untuk nilai selain nol juga.
sumber
Dalam spesifikasi bahasa C ++, tidak ada int seperti nol negatif .
Satu-satunya arti yang dimiliki kedua kata tersebut adalah operator unary yang
-
diterapkan0
, seperti tiga ditambah lima hanyalah operator biner yang+
diterapkan ke3
dan5
.Jika terdapat nol negatif yang berbeda , komplemen dua (representasi paling umum dari jenis bilangan bulat) akan menjadi representasi yang tidak memadai untuk implementasi C ++, karena tidak ada cara untuk merepresentasikan dua bentuk nol.
Sebaliknya, floating point (mengikuti IEEE) memiliki nol positif dan negatif yang terpisah. Mereka dapat dibedakan, misalnya, saat membagi 1 dengan mereka. Nol positif menghasilkan tak terhingga positif; nol negatif menghasilkan tak terhingga negatif.
Namun, jika kebetulan ada representasi memori yang berbeda dari int 0 (atau int apa pun, atau nilai lain apa pun dari jenis lainnya), Anda dapat menggunakan
memcmp
untuk menemukan bahwa:Tentu saja, jika ini benar-benar terjadi, di luar operasi memori langsung, kedua nilai tersebut akan tetap bekerja dengan cara yang persis sama.
sumber
Untuk menyederhanakan saya merasa lebih mudah untuk memvisualisasikan.
Jenis int (_32) disimpan dengan 32 bit . 32 bit berarti 2 ^ 32 = 4294967296 nilai unik . Jadi :
Rentang data int unsigned adalah 0 hingga 4,294,967,295
Dalam kasus nilai negatif itu tergantung pada bagaimana mereka disimpan. Dalam hal
Dalam kasus nilai komplemen One -0 ada.
sumber
int
tidak disimpan dalam 32 bit lebih populer daripada platform dengan pelengkap saat ini.