2016-11-24 15 views
11

Bu siteyi trolle harcadım; Özellikle bu söz konusu: Bunu yaparken Is ((a + (b & 255)) & 255) the same as ((a + b) & 255)?İki imzasız şortun çarpımı gerçekten tanımlanmamış davranışlara yol açabilir mi?

, ben

int main() 
{ 
    unsigned short i = std::numeric_limits<unsigned short>::max(); 
    unsigned short j = i; 
    auto y = i * j; 
} 

nedeniyle sonradan üzerine taşıyor int için i ve j bir tür tanıtımına istenmeyen davranışlara yol açabilir sonucuna yol açmıştır oldum çarpma! Belki de i ve j'un bu kadar büyük olması gerekmez.

Sonucum örneğin unsigned short 16 bit ve int 32 bit olan bir sistemde, davranış tanımlanmamış olabilir, yani.

Burada düzeltildim mi?

+1

no, tanımlanmış davranış (cadı taşma –

+4

@ no no'su dikkate alınmadan '(i * j)% std :: numeric_limits :: max()') ile aynı değere dönüşüyor, bu doğru değil. – Yakk

+2

Bir yorumda bulunmadığınız için üzücü. –

cevap

12

Evet, bu mümkün ve örneğinizin çoğu masaüstü mimarisinde tanımlanmamış olması olasıdır.

Bu örnek için, int'un 32 bit 2'nin tamamlayıcı türü olduğunu ve unsigned short'un 16-bit olduğunu varsayalım.

Tırnak işaretleri için N4140 kullanıyorum.

çarpma önce, her iki değer de int yükseltilirler:

§ 4.5 [conv.prom]/1

BOOL char16_t, char32_t veya wchar_t dışında bir tamsayıdır tip bir prvalue tamsayı dönüşüm sırası (4.13), int değerinden daha az olan int, int türünün tümünün kaynak türünün değerlerini temsil edebiliyorsa, int türünde bir değere dönüştürülebilir; Daha sonra

:

§ 5 [İfade]/4

bir ifade değerlendirilmesi sırasında, sonuç matematiksel ya da için gösterilebilir değerler aralığı tanımlanan değilse onun türü, davranış tanımsızdır. 65535 * 65535 (4294836225) sonucu yana

int (değer aralığı [-2147483648,2147483647] ile) 32-bit tanımlanmamıştır, davranış tanımlanmamıştır.

+1

Yukarıdaki örneğin VS 2013 ile derlendiği PC'mde taşar. –

+0

@RawN Teşekkürler, düzenledi. – krzaq

+0

Harika cevap! Terfi kurallarının C'deki maalesef C++ tarafından benimsenen (dil tasarımı açısından) en kötü şeylerden biri olduğunu düşünüyorum. Onlar sayısız sayısız hata kaynağıdırlar. Neyse ki derleyiciler bir süre uyarıda bulunabilirler. – vsoftco

İlgili konular