SORU
30 Kasım 2012, Cuma


C int long int biçerim ne olur?

Yeni bir ev ödevi büyük bir sayı olabilir, çünkü long sonuç saklamak için değişken kullanmak istedi, oldum.

Bu gerçekten benim için önemli, benim sistem (ıntel ı5/64-bit windows 7/gnu gcc derleyici core) kontrol etmeye karar verdim ve aşağıdaki kodu öğrendim:

printf("sizeof(char) => %d\n", sizeof(char));
printf("sizeof(short) => %d\n", sizeof(short));
printf("sizeof(short int) => %d\n", sizeof(short int));
printf("sizeof(int) => %d\n", sizeof(int));
printf("sizeof(long) => %d\n", sizeof(long));
printf("sizeof(long int) => %d\n", sizeof(long int));
printf("sizeof(long long) => %d\n", sizeof(long long));
printf("sizeof(long long int) => %d\n", sizeof(long long int));

aşağıdaki çıktıyı üretir:

sizeof(char) => 1
sizeof(short) => 2
sizeof(short int) => 2
sizeof(int) => 4
sizeof(long) => 4
sizeof(long int) => 4
sizeof(long long) => 8
sizeof(long long int) => 8

Diğer bir deyişle, benim sistemi int long aynı, ne olacak çok büyük int yapacak olması çok büyük long tutun.

Ödevi kendisi söz konusu değil. , int < long nerede bir sistem üzerinde uzun int I ata nasıl acaba?

Bildiğim kadarıyla gerçek bu there are numerous closely related sorular üzerine bu konu, ama ben hissediyorum cevaplar içinde bu sağlamıyorsa benimle tam bir anlayış ne olacak ya da olmayacak bu süreç.

Temelde aşağıdaki anlamaya çalışıyorum:

  1. Atama önce int 12 *koyun, ya da gerekirlongberi farklı bir veri türü değildir, ama bir değiştirici sadeceolacak kabul doğrudan atamak unharmful?
  2. long > int sistemlerde ne olur? Sonuç olacak tanımlanmamış (veya) öngörülemeyen ya da ekstra parçalar neden olur bu atılacak değişken?
  3. Nasıl C int çalışır long döküm?
  4. Nasıl bilmiyorum zaman C int çalışır long atama yapar döküm kullanımı?

CEVAP
30 Kasım 2012, Cuma


Dil int en az 16 bit olduğunu garanti eder, long en az 32 bit ve long temsil edebiliren azındantüm int temsil edebilecek değerler.

Eğer int bir nesneye long bir değer atarsanız, örtülü olarak dönüştürülür. Bir açık döküm için gerek yok, sadece zaten ne olacak aynı dönüşüm belirlerdi.

int long aynı boyut ve menzil var ne sistem, dönüştürme önemsiz olduğunu, sadece değeri kopyalar.

long uygun değer kazandı. int, daha geniş olduğu bir sistemde bir int, sonra dönüşüm sonucu uygulama tanımlı. (Ya da, C99, başlangıç uygulama tanımlı sinyal yükseltmek olabilir, ama aslında o uygulamaları bilmiyorum.) Negenellikleolur, yüksek sıralı bit atılır, ama o bağlı olmamalıdır. (Kuralları işaretsiz türleri için farklıdır; imzasız bir türü için imzalanmış ya da imzalanmamış bir tamsayı dönüştürme sonucu tanımlanmıştır.)

Eğer ihtiyacınız varsagüvenli bir şekildeint bir nesneye long bir değer atama, atama yapmadan önce uygun olacağı kontrol edebilirsiniz:

#include <limits.h> /* for INT_MIN, INT_MAX */

/* ... */

int i;
long li = /* whatever */

if (li >= INT_MIN && li <= INT_MAX) {
    i = li;
}
else {
    /* do something else? */
}

Detayları "başka bir şey" yapmak istediğinize bağlı olacak.

Bir düzeltme: int longher zamaneğer boyutu ve temsil aynı olması gerçekleşmeden bile farklı türleri,. Aritmetik türleri serbestçe, bu yüzden sık sık bir şey değiştirmez, ama örneğin int* long* farklı ve uyumsuz türleri; edemezsin ata long* int* ya da tam tersi, Olmadan Açık (tehlikeli) attı.

Ve eğer varsa int, yapmanız gereken ilk şey long bir değeri dönüştürmek için gerek kendiniz bulursanız kodunuzu tasarımı yeniden gözden geçirmek. Bazen böyle bir dönüşüm gereklidir, ama daha sık olan tayin ettiğini int başta long olarak tanımlanmış olması gerektiğine işaret ediyorlar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Nesson

    Charles Ness

    27 NİSAN 2006
  • Mismag822 - The Card Trick Teacher

    Mismag822 -

    18 EKİM 2008
  • VitalyzdTv

    VitalyzdTv

    7 AĞUSTOS 2011