SORU
28 AĞUSTOS 2011, Pazar


İşaretsiz tamsayı çıkarma davranışı tanımlanır?

Bir sorun sonucu negatif olacağını zaman aynı türde başka bir tamsayı, işaretsiz bir tamsayı çıkarılarak olduğuna inanıyoruz görünüyor birinden kod ile karşılaştım. Böyle bir kod varsa çok mimari iş olursa bile yanlış olur.

unsigned int To, Tf;

To = getcounter();
while (1) {
    Tf = getcounter();
    if ((Tf-To) >= TIME_LIMIT) {
        break;
    } 
}

Bu bulabildiğim C standardı sadece belli belirsiz ilgili alıntı.

Bir hesaplama imzasız işlenen ilgili hiç çünkü taşma, bu olamaz sonuç işaretsiz tamsayı tarafından temsil edilmesi sonucu yazın en büyük'dan büyük sayı modül azalır elde edilen değer türü tarafından temsil edilebilir.

Bir alıntı sağ işlenen büyük olduğunda işlem modül kesildi numaraları bağlamında anlamlı olması için ayarlanır, şu demek olabilir sanırım.

yani

0x0000 - = = 0x0001 0x10000 - = = 0x0001 0xFFFF

bu uygulama bağımlı imzalı mantığı kullanarak, aksine:

0x0000 - 0x0001 == (imzasız)(0 -1) == (0xFFFF aynı zamanda 0xFFFE veya 0x8001)

Ya ne yorumu değil mi? Hiç tanımlanır?

CEVAP
22 ŞUBAT 2013, Cuma


Çalışırkenimzasıztürleri, modular arithmetic (de bilinir< . em ^"etrafında" . sar davranış) yer alıyor. Bunu anlamak içinmodüler aritmetiksadece bu saatlere bir göz atalım:

enter image description here

9 4 = 1(13 mod 12diğer yönde yani1 - 4 = 9(-3 mod 12). Aynı prensip işaretsiz türleri ile çalışırken uygulanır. Eğersonucu yazınunsigned, modüler aritmetik gerçekleşir.


Şimdi aşağıdaki işlemleri unsigned int: sonuç olarak saklamak bak

unsigned int five = 5, seven = 7;
unsigned int a = five - seven;      // a = (-2 % 2^32) = 4294967294 

int one = 1, six = 6;
unsigned int b = one - six;         // b = (-5 % 2^32) = 4294967291

Sonuç olduğundan emin olmak için istediğiniz zaman signed signed değişken içine veya signed koyun saklı. Sonuç 12 ** ama modüler aritmetik uygulanan engellemek olduğundan emin olmak istiyorsanız, o zaman abs() fonksiyon stdlib.h tanımlanan kullanabilirsiniz:

int c = five - seven;       // c = -2
int d = abs(five - seven);  // d =  2

Çok dikkatli, özellikle koşulları yazarken, çünkü:

if (abs(five - seven) < seven)  // = if (2 < 7)
    // ...

if (five - seven < -1)          // = if (-2 < -1)
    // ...

if (one - six < 1)              // = if (-5 < 1)
    // ...

if ((int)(five - seven) < 1)    // = if (-2 < 1)
    // ...

ama

if (five - seven < 1)   // = if ((unsigned int)-2 < 1) = if (4294967294 < 1)
    // ...

if (one - six < five)   // = if ((unsigned int)-5 < 5) = if (4294967291 < 5)
    // ...

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Friday NightFort

    Friday Night

    15 EYLÜL 2011
  • gsipek

    gsipek

    20 Temmuz 2007
  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006