SORU
8 Aralık 2013, Pazar


int yüzer geçerken işaret değiştirir ve geri

Düşünün benim gerçek sorun SSCCE aşağıdaki kodu,:

#include <iostream>

int roundtrip(int x)
{
    return int(float(x));
}

int main()
{
    int a = 2147483583;
    int b = 2147483584;
    std::cout << a << " -> " << roundtrip(a) << '\n';
    std::cout << b << " -> " << roundtrip(b) << '\n';
}

Bilgisayarım (Xubuntu 12.04.3 LT) çıktı

2147483583 -> 2147483520
2147483584 -> -2147483648

b olumsuz gidiş dönüş sonra nasıl bittiğini unutmayın. Bu davranış, iyi belirtilmiş mi? İnt-şamandıra yuvarlak-açma en azından işaretini düzgün korumak için beklerdim...

Hm, on ideone, çıkış farklı

2147483583 -> 2147483520
2147483584 -> 2147483647

G takım bu arada bir hatayı Düzelt, ya da her iki çıkışı da son derece geçerli?

CEVAP
8 Aralık 2013, Pazar


Programı-kayan nokta tamsayıya dönüştürme taşma nedeniyle tanımsız davranış çağırma. Gördüğünüz şey yalnızca x 86 işlemciler üzerinde her zamanki belirtisidir.

float değeri en yakın 2147483584 231tam olarak ne kadar olabilir, ve bu durumda olan. (kayan nokta tamsayı dönüştürme genellikle en yakın mermi, İçin belirli davranış zaman has bir tamsayı, kayan nokta, uygulama tanımlı, çoğu uygulamaları tanımlamak yuvarlama gibi olmak “göre DEĞERLERİ yuvarlama modu”, ve DEĞERLERİ varsayılan yuvarlama modu için turun en yakın).

Kaydır 2 temsil dönüştürme süre sonra31int taşma oluşur. Bu taşma tanımsız davranıştır. Bazı işlemciler özel bir durum ortaya, Diğerleri doyurmak. IA-32 talimat cvttsd2si genellikle Derleyiciler tarafından oluşturulan her zaman taşması halinde INT_MIN dönmek için, kaydır olumlu veya olumsuz olup olmadığına bakılmaksızın gerçekleşir.

Olmamalı güveniyor bu davranış bile, biliyorsun hedefleyen bir Intel işlemci: hedef x 86-64, Compiler olabilir yayarlar, dönüşüm için gelen kayan nokta için tam sayı sequences of instructions that take advantage of the undefined behavior to return results other than what you might otherwise expect for the destination integer type.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ecf150king

    ecf150king

    20 Ocak 2006
  • monkophile

    monkophile

    25 Temmuz 2007
  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011