Neden onaltılı sayıların önüne 0x eklenir?


414

Onaltılık sayılar neden öneklidir 0x? Ön ekin kullanımını anlıyorum, ancak neden 0xseçildiğinin önemini anlamıyorum .


9
Şimdi başlığın ve metnin tamamen farklı iki soru sorduğunu anlıyorum. Çoğu yanıt başlıktaki soruya odaklanır. Metindeki sorunun cevabı basitçe "hiçbir şey ifade etmez - derleyiciye tamsayının onaltılık olarak yazıldığını söyleyen bir önektir".
Andreas Rejbrand

30
Bilgiçlikçi olmak için, başlıktaki soruyu iki farklı şekilde de yorumlayabiliriz: 1) "Onaltılık sayılar, diğer herhangi bir önek veya göstergenin aksine neden 0x olarak önek olarak alınır?" 2) "Onaltılı sayıları girerken neden bir önek kullanmamız gerekiyor? Elbette derleyici 58A'yı önek olmadan da onaltılı sayı olarak tanıyacaktır?" Sorunun ikinci yorumunun cevabı önemsizdir. "123" aynı zamanda onaltılı bir sayıdır.
Andreas Rejbrand

Yanıtlar:


440

Kısa hikaye:0 Bir sabit (ve bir tanımlayıcı / saklıdır kelime) aşar ayrıştırıcı söyler. Sayı tabanını belirtmek için hala bir şeye ihtiyaç vardır: xkeyfi bir seçimdir.

Uzun hikaye: 60'lı yıllarda yaygın programlama sayı sistemleri ondalık ve sekizli idi - ana çerçevelerin bayt başına 12, 24 veya 36 biti vardı, bu da 3 = log2 (8) ile güzel bir şekilde bölünebiliyordu.

BCPL dili 8 1234sekizlik sayılar için sözdizimini kullanmıştır . Ken Thompson BCPL'den B yarattığında, 0bunun yerine öneki kullandı. Bu harika çünkü

  1. bir tamsayı sabiti artık her zaman tek bir simgeden oluşur,
  2. Ayrıştırıcı hala bir sabit olduğunu söyleyebilir,
  3. ayrıştırıcı hemen tabana söyleyebilir ( 0her iki bazda da aynıdır),
  4. matematiksel olarak aklı başındadır ( 00005 == 05) ve
  5. değerli özel karakterlere gerek yoktur (olduğu gibi #123).

B, B'den yaratıldığında, onaltılık sayılara ihtiyaç duyuldu (PDP-11'in 16 bitlik sözcükleri vardı) ve yukarıdaki tüm noktalar hala geçerliydi. Sekizli diğer makineler için hala gerekli olduğundan 0x, keyfi olarak seçildi ( 00muhtemelen garip olarak kabul edildi).

C #, C'nin soyundan gelir, dolayısıyla sözdizimini devralır.


112
Sanmıyorum 0xüzerinde 00tercihi / beceriksizlik oldu. 00mevcut kodu kırar. 0010sekizlik olduğu gibi 8, süre 0010onaltılık olurdu 16. Herhangi bir sayıyı ikinci basamak göstergesi olarak kullanamazlardı ( 8veya hariç 9, ve onaltılık sayı ile ilgili herhangi bir önemi yoktur), bu nedenle bir harf zorunludur. Ve bu ya 0hda 0x( H e X idecimal) bırakır . Bu noktadan itibaren gerçekten tercihe döndü.
GManNickG


23
0Sekizli için bir önek kullanmak yıllar boyunca çok fazla soruna neden oldu. Özellikle İngiltere gibi telefon numaralarının başladığı ülkelerde a 0. Javascript ve diğer birçok dil, bunları sekizlik olarak ayrıştırır ve saklamadan önce sayıyı karıştırır. Eğlenceye eklemek için, bir popüler veritabanı ürünü , sayı bir veya içeriyorsa sessizce ondalık ayrıştırmaya geri dönecektir . 89
Temel

1
12, 24 ve 36 da 4'e bölünebilir, neden bunun için onaltılık düşünmediler?
phuclv

4
@ LưuVĩnhPhúc Muhtemelen onaltılık çok ilgili olmadığı için. Zamanın donanım, yazılım ve belgelerinin çoğu sekizli çok daha iyi uyuyor. BCPL ilk olarak 36 bitlik bir IBM 7094 üzerinde uygulandı, talimat formatı iki 3 bit parça ve 2 15 bit parçaya bölündü; 6 bit karakter; ve sekizlik belgeler. B'nin erken uygulamaları bir PDP-7 (18 bit) ve bir Honeywell GE-945 (36 bit, ancak 18 bit adresleme ve 6 ve 9 bit bayt desteği) üzerindeydi. 16 bit PDP-11 B'den sonra çıktı, bu yüzden B'nin tasarımını çok fazla etkilemezdi.
8bittree

97

Not: Doğru cevabı bilmiyorum, ancak aşağıda sadece benim kişisel spekülasyonum var!

Bir sayıdan önce 0 olarak bahsedildiği gibi, sekizli olduğu anlamına gelir:

04524 // octal, leading 0

Onaltılık sayıları belirtmek için bir sistem bulmanız gerektiğini düşünün ve C tarzı bir ortamda çalıştığımızı unutmayın. H gibi montaj ile bitmeye ne dersiniz? Maalesef yapamazsınız - bazı kötü belirsizlikler için geçerli olan geçerli tanımlayıcılar (örneğin, bir değişkeni aynı şeyi adlandırabilirsiniz) belirteçleri yapmanıza izin verir.

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

Aynı nedenden ötürü bir karakterle liderlik edemezsiniz:

xFF00 // also valid identifier

Ön işlemciyle çakıştığından muhtemelen bir karma kullanmak dışarı atılmıştır:

#define ...
#FF00 // invalid preprocessor token?

Sonunda, her ne sebeple olursa olsun, onaltılık anlamına gelen 0 başından sonra x koymaya karar verdiler. Hala bir sayı karakteri ile başladığı için belirsiz bir karakterdir, bu nedenle geçerli bir tanımlayıcı olamaz ve muhtemelen önde gelen 0'ın sekizlik kuralına dayandırılır.

0xFF00 // definitely not an identifier!

3
İlginç. Ben hex belirtmek için önde gelen 0 VE son h kullanmış olabileceğini hayal ediyorum. Sondaki h muhtemelen tür belirtici soneki ile karıştırılır, örneğin 0xFF00l vs 0FF00hl
zdan

2
Bu argüman, sekizli sayıları belirtmek için baştaki sıfır kullanımının onaltılık "0x" önekinin kullanılmasından önce geldiğini ima eder. Bu doğru mu?
Andreas Rejbrand

1
İkisi de aynı anda icat edilmez miydi? Neden biri olabilir ama diğeri olmaz?
AshleysBrain

AshleysBrain @ ocrřola'nın neden sekizli olabileceğini, ancak aynı zamanda onaltılı olmadığını gösteren cevabı görüyor.
jv42

2
@zdan uzun zaman önce kullanmışlar. X86 Intel derlemesinde, bir karakterle başlıyorlarsa onaltılı bir harfin başına daima 0 işareti gelmelidir. Örneğin 0xFFAB1234, olarak yazılmalıdır 0FFAB1234h. Gençken Pascal'da satır içi
asm'den hatırlıyorum

27

Sayının başka bir bazdan ziyade onaltılı olduğunu göstermek için bir önektir. C programlama dili derleyiciye bunu söylemek için kullanır.

Misal:

0x6400çevirir 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. derleyici okuduğunda 0x6400, bu sayı yardımıyla onaltılık anladığı 0x vadede. Genellikle (6400) 16 veya (6400) 8 veya her neyse anlayabiliriz .

İçin ikili olurdu:

0b00000001

Umarım bir şekilde yardım etmişimdir.

İyi günler!


2
İkili değişmezler yalnızca C ++ 14'ten beri C ++ 'da desteklenir ve C'de hiç desteklenmez.
Ruslan

1
Bu nedenini açıklamıyor . Özellikle, ilk örneği neden yazamıyorsunuz x6400? xHala Onaltılık anlaması için kullanılabilir.
Aaron Franke

12

Önceki 0, taban 2, 8 veya 16'daki bir sayıyı belirtmek için kullanılır.

Benim düşünceme göre 0x, hex'i belirtmek için seçildi çünkü 'x' hex gibi geliyor.

Sadece benim düşüncem, ama bence mantıklı.

İyi günler!


2
Cevap için teşekkürler! Bunun StackOverflow'daki ilk yazınız olduğunu anlıyorum. Görüşler gerçeklerden ayrılırsa cevap daha yararlı olabilirdi.
vivek_ganesan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.