SORU
20 NİSAN 2013, CUMARTESİ


Nasıl bir değer boyutu 8 bit daha büyük 8-bit bir tamsayı elde ettim mi?

Aşağı son derece kötü bir hata bu küçük taş arkasına saklanmış buldum. C spec başına, imzalı taşmaları sadece taşma değeri bit genişliği sizeof(int) genişletilmiş oluşur zaman tanımsız davranış, ama olduğunun farkındayım. Anladığım kadarıyla char artan hiç tanımsız davranış sürece sizeof(char) < sizeof(int) olmamalı. Ama o c nasıl açıklamıyorimkansızdeğer. 8-bit bir tamsayı olarak nasıl c kendi değerlerinden daha büyük bit genişliği tutabilir?

Kod

// Compiled with gcc-4.7.2
#include <cstdio>
#include <stdint.h>
#include <climits>

int main()
{
   int8_t c = 0;
   printf("SCHAR_MIN: %i\n", SCHAR_MIN);
   printf("SCHAR_MAX: %i\n", SCHAR_MAX);

   for (int32_t i = 0; i <= 300; i  )
      printf("c: %i\n", c--);

   printf("c: %i\n", c);

   return 0;
}

Çıktı

SCHAR_MIN: -128
SCHAR_MAX: 127
c: 0
c: -1
c: -2
c: -3
...
c: -127
c: -128  // <= The next value should still be an 8-bit value.
c: -129  // <= What? That's more than 8 bits!
c: -130  // <= Uh...
c: -131
...
c: -297
c: -298  // <= Getting ridiculous now.
c: -299
c: -300
c: -45   // <= ..........

Check it out on ideone.

CEVAP
20 NİSAN 2013, CUMARTESİ


This is a compiler bug.

İmkansız tanımsız davranış için sonuçları almak için geçerli bir sonucu olsa da, aslında kodunuzu tanımsız davranış yoktur. Ne derleyici olduğunudüşünüyordavranışı tanımsızdır, ve buna göre optimize eder.

Eğer c olarak tanımlanır int8_t int8_t teşvik int c-- anlam çıkarma gerçekleştirmek c - 1 int aritmetik ve dönüştürme sonucu geri int8_t. int çıkarma değil taşma, ve başka bir tamsayı türü için Aralık dışı integral değerlerini dönüştürme geçerli değil. Eğer hedef türü imzalanırsa, sonuç, uygulama tanımlı, ama hedef türü için geçerli bir değer olmalı. (Ve eğer hedef türü işaretsiz ise, sonuç bellidir. ama burada geçerli değildir.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • El SalvaLobo

    El SalvaLobo

    10 Temmuz 2006
  • finalcall07

    finalcall07

    11 NİSAN 2008
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007