SORU
25 Ocak 2009, Pazar


'kısa' - Java döküm ilkel türü

Java ilkel türü short hakkında bir sorum var. FIRSATLAR 1.6 kullanıyorum.

Eğer şu var:

short a = 2;
short b = 3;
short c = a   b;

derleyici derleme istemiyor - "int" ve short, yani bu bir döküm yapmak önerir: . kısa dönüştürülemiyor diyor

short c = (short) (a   b);

gerçekten işe yarıyor. Ama benim sorum neden dökme gerek var mı? A ve b değerleri short - kısa bir değerler dizisidir {- 32,768 için, 32767} aralığında. Ben de işlemleri -, *, / diğerlerini kontrol etmedim) yapmak istediğinizde atmak lazım.

Eğer aynı ilkel türü yaparsam int, int aa bb dökme gerek yok. Aşağıdaki gayet iyi çalışıyor:

int aa = 2;
int bb = 3;
int cc = aa  bb;

Yazın iki değişken kısa eklemek için gerekli bir sınıf tasarlarken bu keşfettim, ve derleyici bana bir döküm yapmak istedim. Eğer bir tür iki değişken ile bunu yaparsam int dökme gerek yok.

Şimdiden çok teşekkür ederim.

Küçük bir not: olur da aynı şeyi ilkel tipi ile byte. Bu yüzden, bu gibi çalışır:

byte a = 2;
byte b = 3;
byte c = (byte) (a   b);

ama bu değil:

byte a = 2;
byte b = 3;
byte c = a   b;

, *, *24longfloat, ve int, dökme gerek yok. short byte değerleri için sadece.

CEVAP
25 Ocak 2009, Pazar


short C# (aynı zamanda Java gibi diğer dil derleyicisi için de) açıkladı

Int için kısa, uzun, çift uçuyorlar, ya da ondalık önceden tanımlanmış örtülü bir dönüşüm var.

Olamaz örtülü olarak kısa (integral depolama boyutları için Ayrılmaz Türleri Tablosu) için daha büyük depolama boyutu nonliteral sayısal türleri dönüştürmek. Düşünün, örneğin, aşağıdaki iki kısa değişkenleri x ve y:

short x = 5, y = 12;

Aşağıdaki atama ifadesi bir derleme hatası üretecektiratama operatörünün sağ tarafında aritmetik ifade varsayılan olarak int değerlendirir.

short z = x   y;   // Error: no conversion from int to short

Bu sorunu çözmek için, bir döküm kullanın:

short z = (short)(x   y);   // OK: explicit conversion

Hedef değişken aynı depolama boyutu veya büyük depolama boyutu olduğu şu ifadeler kullanmak olanaklıdır:

int m = x   y;
long n = x   y;

< / ^ hr .

İyi bir takip soru şudur:

< . p ^"atama operatörünün sağ tarafındaki ifadenin varsayılan olarak int olarak değerlendirilen" ?

İlk cevap bulunabilir:

Classifying and Formally Verifying Integer Constant Folding

Java dil şartnamesi tam sayı ile temsil edilir ve tam olarak tamsayı aritmetik ifadeler değerlendirilecek nasıl tanımlar. Bu programlama dili, İnternet üzerinde dağıtılmış uygulamalarda kullanılmak üzere tasarlanmıştır Java önemli bir özelliğidir.Bir Java programı aynı sonucu hedef makine bağımsız olarak üretmeye yürütülmesi gereklidir.

Buna karşılık, C (ve yaygın olarak kullanılan çoğunluğu zorunlu ve -Nesneye Yönelik Programlama dili) daha özensiz ve birçok önemli özellikleri açık bırakır. Bu yanlış dil arkasındaki niyeti şartname açık. Aynı C programları bir 16-bit çalıştırmak gerekiyor 32-bit veya 64-bit tamsayı aritmetik başlatmasını tarafından mimarlık aritmetik işlemler-dahili hedef işlemci ile kaynak program. Bu kullanılabilir, çünkü çok daha verimli kod yol açar makine işlemleri doğrudan. Tamsayı hesaplamaları tek anlaşma olduğu sürece sayı ile “yeterince” hayır tutarsızlıkları ortaya çıkacak. küçük

Bu anlamda, C tamsayı aritmetik tam olarak tanımlanan bir yer tutucudur bu programlama dili belirtimi ama sadece tamamen hedef makinenin belirleyerek örneği.

Java tam olarak temsil tamsayılar ve tamsayı aritmetik hesaplanacak tanımlar.

      Java Integers
--------------------------
Signed         |  Unsigned
--------------------------
long  (64-bit) |
int   (32-bit) |
short (16-bit) |  char (16-bit)
byte  (8-bit)  |

Char sadece işaretsiz tamsayı türüdür. Değerleri Unicode karakterleri, 2 0 \uffff, yani \u0000 temsil eder16-1.

Eğer bir tamsayı operatör türü uzun bir işlenen varsa, diğer işlenen de yazın uzun dönüştürülür. Aksi takdirde işlem gerekirse daha kısa işlenen de int dönüştürülür eğer int türünde işlenen üzerinde yapılır. Dönüşüm kuralları tam olarak belirtilmedi.

[Teorik Bilgisayar Elektronik Notları Bilim 82 No 2 (2003)< / ^ br . -İğrenç-Blesner COCV 2003: Sabine GLESNER, Jan Olaf İĞRENÇ,< / ^ br . Fakultät für Enformatik,< / ^ br . Üniversitesi Karlsruhe< / ^ br . Karlsruhe, Almanya]

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bach Vlogs

    Bach Vlogs

    18 HAZİRAN 2011
  • DetroitBORG

    DetroitBORG

    29 Temmuz 2008
  • StalkerJS

    StalkerJS

    15 HAZİRAN 2010