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
İ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.)
Nasıl dizi boyutu bir (1) mongodb daha...
Nasıl div içeriğini daha büyük değil y...
Nasıl NSString için bilimsel deneyler ...
Nasıl aygıtı belirlemek için ekran boy...
Nasıl tüm tarihler SQL Server belirli ...