INT_MIN-1 bir taşma mı yoksa taşma mı?


10

Bunu okuduğumu hatırlıyorum

  • underflowartık bir türde sunulamayan çok küçük bir büyüklüğünüz olduğu anlamına gelir
  • overflowartık bir türde sunulamayan çok büyük bir büyüklüğe sahip olduğunuz anlamına gelir

Ancak, pratikte terimlerin kullanıldığını

  • underflowartık bir türde sunulamayan çok küçük bir değere sahip olduğunuz anlamına gelir
  • overflowartık bir türde sunulamayan çok büyük bir değere sahip olduğunuz anlamına gelir

Burada kullanılacak doğru anlam nedir? Tamsayı ve kayan nokta türleri için terimler farklı mı tanımlanmış?


2
Genel olarak, "taşma" terimi kayan nokta aritmetiği için ayrılmıştır. Tamsayılarla, ister olsam da, genellikle "taşma" diyorum INT_MIN - 1ya daINT_MAX + 1
Charles Salvia

Yanıtlar:


15

Bu konuda gerçekten "güvenilir" bir kaynak bulamıyorum, çünkü bu büyük olasılıkla bir konvansiyon meselesidir ve terminoloji genellikle çok tutarsızdır. Ancak, Robert Seacord'un " C ve C ++ 'da Güvenli Kodlama " dan aşağıdaki alıntı , durumu anlamamı özetliyor:

Bir tamsayı maksimum değerinin üzerinde artırıldığında veya minimum değerinin 3 üzerinde olduğunda bir tamsayı taşması meydana gelir . Tamsayı taşmaları temel temsil ile yakından ilişkilidir.

Dipnot şunları söylemeye devam ediyor:

[3] Bir tamsayıyı minimum değerinin ötesine düşürmek, genellikle teknik olarak bu terim bir kayan nokta koşulu anlamına gelse de, bir tamsayı alt akışı olarak adlandırılır .

Tamsayı taşması olarak adlandırmamızın nedeni , türde değeri temsil etmek için yeterli alan bulunmamasıdır. Bu anlamda, bir arabellek taşmasına benzer (aslında arabellek sınırını geçmek yerine, genellikle etrafı saran davranışlar gösterir. *) Bu açıdan bakıldığında, INT_MIN - 1ve arasında hiçbir kavramsal fark yoktur INT_MAX + 1. Her iki durumda da intveri türünde her iki değeri temsil etmek için yeterli alan yoktur - bu yüzden elimizde bir taşma vardır .

X86 ve x86_64 işlemci mimarilerinde, bayrak kaydının bir taşma biti içerdiğine dikkat etmek de yararlı olabilir . Taşma biti, işaretli bir tam sayı aritmetik işlemi taştığında ayarlanır. İfade INT_MIN - 1taşma bitini ayarlayacaktır. ("Taşma" biti yoktur.) Açıkça, AMD ve Intel'deki mühendisler, veri türüne sığmayacak kadar çok biti olan bir tamsayı aritmetik işleminin sonucunu tanımlamak için "taşma" terimini kullanırlar. değer sayısal olarak çok büyük veya çok küçük.


* Aslında, C'de imzalı tamsayı taşması aslında tanımlanmamış bir davranıştır, ancak Java gibi diğer dillerde, ikisinin tamamlayıcı aritmetiği etrafa sarılır.


6

Bu bir taşma. Tamsayı değerleri için bir alt akış oluşmaz.

Taşma, bir değerin belirli bir türle gösterilemeyecek kadar büyük (sıfırdan çok uzak) ve yetersiz akış ise çok küçük olduğunda (sıfıra çok yakın).

Sıfıra (1 ve -1) en yakın tamsayı değerleri yine de herhangi bir tamsayı değişkeni ile temsil edilebildiğinden (birden fazla bite sahip işaretli bir tamsayı varsayarak), bir alt akış gerçekleşemez.

Taşması üzerinde Wikipedia makalesi oldukça net açıklama vardır:

"Aritmetik alt akış (veya" kayan nokta alt akışı "veya sadece" alt akış "), bir kayan nokta işleminin gerçek sonucu büyüklükte (yani sıfıra yakın) olduğunda ortaya çıkabilecek bir durumdur. hedef veri tipinde normal bir kayan nokta sayısı olarak temsil edilebilen en küçük değerden daha düşük. Alt taşma kısmen kayan nokta değerinin üssünün negatif taşması olarak kabul edilebilir. "


Genellikle, underflowbir sayının büyüklüğünün mümkün olan en küçük sıfır olmayan değerinkinden daha küçük, ancak sıfır olmayan değerler arasındaki olası en küçük mesafeden daha büyük olduğu belirli bir duruma atıfta bulunmak için özellikle kullanıldığını belirtmek yararlı olabilir. kelimelerin, sayıların Wiki makalesinin "taşma boşluğu" olarak adlandırdığı şeye girdiği durumlar. IEEE-744 uyumlu uygulamalarda, temsil edilebilir en küçük sayı, sayılar arasındaki temsil edilebilir en küçük farka eşittir, bu nedenle bu tür taşmalar gerçekleşemez, ancak PC dünyasının dışında, tüm sistemler IEEE uyumlu değildir.
supercat

2

Tamsayı matematikte taşma hem çok büyük hem de çok küçük değerlere karşılık gelir. Kayan noktada, taşma çok büyük bir üs anlamına gelir ve taşma çok küçük bir üs anlamına gelir.

Aslında, tamsayı tipleri için, CPU'ların taşma ve taşma arasındaki farkı söyleyemezler. Aşağıdaki 16 bitlik eklentiyi alın:

  0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
  0x7FFF (32767, the carried '1' is lost)

CPU'daki taşma bayrağı, elbette, bu eklemeden sonra ayarlanır. İmzalı matematik kullanıldığında sonuç çok küçük (-32768). İmzasız matematik kullanıldığında sonuç çok büyük (0x17FFF). 2'nin tamamlayıcı matematiği imzalı ve imzasız tipler için aynı olduğundan, overflowhem çok büyük hem de çok küçük değerler anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.