2016-03-31 21 views
2

C99 standardında, imzalanmış tamsayı taşması tanımlanmamış bir davranış olduğunu söyleyebilir mi?C99 standardında, imzalanmış tamsayı taşması tanımlanmamış davranış olduğunu söyleyebilir mi?

ben işaretsiz tamsayı taşması bölümünde 6.2.5 yılında (Why is unsigned integer overflow defined behavior but signed integer overflow isn't? bakınız) iyi tanımlanmış olma konusunda yorumunu bakın:

imzasız işlenen içeren bir hesaplama yapabilirsiniz asla taşması, çünkü tarafından temsil edilemez bir sonuç Ortaya çıkan işaretsiz tamsayı türü, sonuç türü tarafından temsil edilen olabilen en büyük değerden daha büyük bir sayı olan indirgenmiş modüldür.

ama tanımsız davranışlar üzerinde Ek J arıyorum ve sadece listede bu benzer öğeleri görmek:

bir ifade imzalanan terfi tip sola kaydırıldığı sahip ve değeri ya ifadesi negatifse veya kayması sonucu terfi tip sunulabilen olmayacaktır olacağını

ve

bir tamsayıdır aritmetik veya dönüşüm fonksiyonun sonucunu

değeri I yok aritmetik kendisi

+1

C99 taslak standardı n1256 * 6.5 İfadeler 5 Bir ifadenin değerlendirilmesi sırasında istisnai bir durum ortaya çıkarsa (yani sonuç matematiksel olarak tanımlanmamışsa veya türü için temsil edilen değerler aralığında değil, davranış tanımsızdır. * – EOF

+0

@EOF: Neden bunu bir yanıt olarak göndermeyin? –

+0

@NateEldredge: Görebildiğim kadarıyla, bu bağlamda özdeş olan C11 taslak standardına dayanan bir cevap var. – EOF

cevap

4

tamsayı olup,

(bu "bir tamsayıdır aritmetik fonksiyonu" anlamına gelir not temsil olamaz istisnai bir durum bir ifadenin değerlendirilmesi (sonuç matematiksel olarak tanımlanmış olup olmadığını yani, esnasında meydana gelirse hayır

: C99 bir kopyası, ama C11 standardında bu metin Bölüm 6.5, paragraf 5 belirir t türüne göre temsil edilen değerler aralığında), davranış tanımsızdır. Herhangi bir taşma için bir yakalama gibi görünen; imzasız tamsayılarla ilgili metin, daha sonra 6.5 ¶ 5'in üzerinde özel bir durum olur.

+0

ah - Bunu bir şekilde özledim. Teşekkürler! İmzasız taşma konusundaki yorum daha güçlü bir şekilde belirtilmelidir; standardın diğer bölümleri tarafından ima edildiği gibi geliyor ("Oh, bu bunun için doğru") ama standartta başka yerlerde belirtilen modulo davranışını göremiyorum. –

+0

Evet; Ek J'de “sonuç değerinin” kuralına bir istisna olarak mevcut olmaması gariptir. Yardımcı olduğuma sevindim! –

+0

@JasonS: C11 taslak standardı n1570, * 6.2.6'ya bakabilirsiniz.2 Tamsayı türleri 1 İmzasız char haricinde işaretsiz tamsayı türleri için, nesne gösteriminin bitleri iki gruba ayrılır: değer bitleri ve dolgu bitleri (sonuncusu yoktur). Eğer N değeri bitleri varsa, her bit 1 ile 2 N-1 arasında 2 farklı bir gücü temsil etmelidir, böylece bu tipteki nesneler, saf ikili temsil kullanılarak 0'dan 2 N-1'e kadar değerleri temsil edebilecektir; bu değer temsil olarak bilinmelidir. Herhangi bir doldurma bitinin değerleri belirtilmemiş. * – EOF

İlgili konular