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

  • dhcrr's channel

    dhcrr's chan

    2 Ocak 2007
  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010