32 bit makineler yalnızca 2 ^ 32'ye kadar sayıları işleyebiliyorsa neden 100000000000000 (trilyon) sayısını makinem kilitlenmeden yazabilirim?


370

32-bit bilgisayarlar sadece 2 31 - 1'e kadar işaretli tamsayıları depolayabilir .
Bu nedenle IPv4 adresleri tükendi ve 64-bit dönemine girdik.

Bununla birlikte, 2 31 - 1 (2.147.483.647), makinemde bir çökme olmadan, iyi bir şekilde görüntüleyebileceğim 1 trilyon (1.000.000.000.000) kadar büyük değil.

Birisi bunun neden olduğunu açıklayabilir mi?


35
Soru hatalı. 32 bit makineler 2 ^ 32'den daha büyük sayıları işleyebilir. Her zaman 'uzun' ve benzeri şeyler yaparlar. Bir kayıt defterinde sadece 2 ^ 32'ye kadar saklayabilirler, ancak yazılım bu sorunu atlamak için yazılmıştır. Bazı modern dillerin verilen sayının uzunluğunda bile bir sorunu yok.
JFA

23
Lütfen konuyla ilgili, kibar ve sorunun teknik yönleriyle ilgili yorumları saklayın. Neredeyse 50 şaka yorumunun kaldırılması gerekiyordu ve gönderiyi kilitlemek zorunda kalmamak istiyoruz. Teşekkür ederim.
nhinkle

6
Bu soru biraz özensiz bir şekilde yazılmıştır. 1000000000000 sayısını "yazmak" ve "görüntülemek" ile ne demek istiyorsunuz? Soruyu yazdığınızda, 1000000000000 sayısını yazdınız ve web tarayıcınız bunu gayet iyi gösteriyor, sanırım, ancak bu daha önce bir bilgisayarı kullanan hiç kimseye garip bir şey olmamalı. Bu soru ücretsiz yorumlamayı istiyor.
HelloGoodbye

7
İnsan bilincinin yaklaşık 50 bit tutacağı tahmin edilmektedir (bir yerlerde okudum). Yani soru " 10^9Bilgisayarım çökmeden nasıl yazabilirim ?" Değil. ama " 10^(18)Beynim çökmeden nasıl yazabilirim ?"
Hagen von Eitzen

1
32 bit bilgisayarlar, yalnızca 2 ^ 32 - 1'e kadar UNSIGNED tamsayılarını depolayabilir. 2 ^ 32 - 1, 2.147.483.647 ... 300 oylamaya eşit değil ve bunu kimse anlamadı mı?
Koray Tugay

Yanıtlar:


784

Sorunuza farklı bir soru sorarak cevap veriyorum:

Parmaklarınıza 6'ya nasıl güvenirsiniz?

Muhtemelen bir elinizle mümkün olan en büyük sayıya kadar sayıyorsunuz ve ardından parmaklarınız bittiğinde ikinci elinize geçiyorsunuz. Bilgisayarlar aynı şeyi yaparlar, tek bir sicilden daha büyük bir değeri temsil etmeleri gerekiyorsa, verilerle çalışmak için birden fazla 32bit blok kullanırlar.


16
Komik, @ kod adı. Öyleyse parmaklarınızı 32 veya daha fazlasına nasıl sayarsınız (örneğin, 2 ^ 5 tükendiğinde)? ;) Birinin diğer eline geçmenin analojisi iyidir ... ikili bir kişinin diğer eline geçme ihtiyacını geciktirse bile. Görmek istediğim , çift parmakla daha fazla saymak için parmak uçlarına geçmek için el becerisi ile 1.024 veya daha fazla saymak - 1.048.575'e kadar! :) Bu potansiyel olarak 20-bit kızak gücü. : P
J0e3gan

14
Lütfen bu cevabın teknik yönlerini tartışmak için konuyla ilgili yorumlarda bulunun. 60'tan fazla şaka yorumu bu yanıttan zaten silinmiştir ve yayını kilitlemek zorunda kalmaktan kaçınmak istiyoruz.
nhinkle

@ kod adı-kolay, bir parmağını yığın işaretçisi olarak ata. Parmaklarınız tükendiğinde, miktarı yığına ekler ve saymayı yeniden başlatırsınız.
Makach

Bunu nereden öğrendin, @ kod adı? Bunu ilk önce Frederik Pohl'dan
Zane

2
Bunun ilgili sorunun cevabı olmadığını düşünüyorum. Tarafından cevap @ Bigbio2002 doğru olanıdır. Burada "1000000000000" sadece "adsfjhekgnoregrebgoregnkevnregj" gibi bir sayı değil, bir metindir. Söylediklerin doğru, ama bunun doğru cevap olmadığını kuvvetle hissediyorum. Ve çok fazla yükseltme görmek için ...
Usta Şefi

398

32 bit bir tamsayı 2 ^ 32-1'den daha büyük bir değer tutamıyorsa doğrudur. Ancak, bu 32 bit tamsayının değeri ve ekranınızda nasıl göründüğü tamamen farklı iki şeydir. Yazdırılan dize "1000000000000", bellekteki 32 bit tam sayı ile gösterilmez.

Kelimenin tam anlamıyla "1000000000000" sayısını görüntülemek için 13 bayt bellek gerekir. Her bir bayt, 255'e kadar bir değer tutabilir. Hiçbiri sayısal değerin tamamını tutamaz, ancak ASCII karakterleri olarak ayrı ayrı yorumlanabilir (örneğin, ' 0' karakteri , 48 ondalık değerle gösterilir, ikili değer 00110000), bir insan için, sizin için anlamlı olan bir formata sokulur.


Programlamada İlgili bir kavramdır tiplemeleri bir bilgisayar belirli bir akışı yorumlayacaktır nasıl olduğu, 0s ve 1s. Yukarıdaki örnekte olduğu gibi, sayısal bir değer, bir karakter veya hatta tamamen başka bir şey olarak yorumlanabilir. 32 bit bir tam sayı 1000000000000 değerini tutamayabilirken, tamamen farklı bir yorum kullanarak 32 bitlik kayan nokta sayısı elde edilebilir.

Bilgisayarların dahili olarak büyük sayılarla nasıl çalışabileceği ve işleyebileceğine gelince, 64-bit tam sayılar (16 milyar milyar değere kadar olan değerleri barındırabilen), kayan nokta değerleri ve isteğe bağlı olarak büyük boyutlarda çalışabilen özel kütüphaneler var sayılar.


22
Aslında bu çoğunlukla doğrudur ama tam olarak değil. 32 puntoluk kayan noktalı bir sayının 1000000000000'ü doğru şekilde göstermesi pek mümkün değildir.
Tim B

6
@TimB: Ondalık32 formatını duydunuz mu? IEEE 754-2008 standardının bir parçasıdır. Bu biçim, bu sayının doğru gösterilebiliyor :)
VX

15
Doğru, olabilir. Ancak bu, insanların geçerli bilgisayarlarda standart kayan nokta işlemcileri tarafından depolanan ve kullanılan 32bit kayan nokta sayısını ifade eden "kayan nokta" dedikleri biçiminde değildir.
Tim B

2
@TimB gerçekten. Float32 olarak gösterilebilecek sayıya en yakın sayı 999999995904
greggo

4
@TimB: Ancak 64 bitlik bir kayan nokta sayısı 1000000000000tam olarak kolayca gösterilebilir . 10 ^ 12 veya 2 ^ 12 * 5 ^ 12; 5 ^ 12, 28 bit mantis gerektirir.
Keith Thompson

191

İlk ve en önemlisi, 32-bit bilgisayarlar tek bir makine kelimesinde 2³²-1'e kadar sayıları saklayabilir . Makine kelimesi , CPU'nun doğal bir şekilde işleyebileceği veri miktarıdır (yani, bu boyuttaki verilerle ilgili işlemler donanımda gerçekleştirilir ve genellikle en hızlı şekilde gerçekleştirilir). 32 bit CPU'lar 32 bitten oluşan sözcükler kullanır, böylece 0'dan 2³²-1'e kadar bir sayıyı tek bir kelimede saklayabilirler .

İkincisi, 1 trilyon ve 1000000000000 iki farklı şeydir.

  • 1 trilyon soyut bir sayı kavramıdır
  • 1000000000000 metindir

1Bir defa ve sonra 012 defa tuşlarına basarak metin yazarsınız. 1girişler 1, 0girişler 0. Görmek? Karakterleri yazıyorsun. Karakterler sayı değildir. Daktiloların CPU ya da belleği yoktu ve bu "sayıları" oldukça iyi kullanıyorlardı, çünkü bu sadece metin.

1000000000000'ün bir sayı değil, metin olduğunu kanıtlayın : 1 trilyon (ondalık), 4096 (ikili) veya 281474976710656 (onaltılık olarak) anlamına gelebilir. Farklı sistemlerde daha da çok anlamı var. Anlamı 1000000000000 bir sayıdır ve depolayarak (biz bir anda ona geri alırsınız) farklı bir hikayedir.

Metni saklamak için (programlamada dize olarak adlandırılır ) 1000000000000, 14 bayta ihtiyacınız vardır (her karakter için bir tane artı temelde "dize burada biter" anlamına gelen sonlandırıcı bir NULL baytı). Bu 4 makine kelimesi. 3 buçuk yeterli olacaktır, ama dediğim gibi, makine kelimeleri üzerindeki işlemler en hızlı olanıdır. Farz edelim ASCII metin depolama için kullanılır, böylece bellekte bu şekilde görünecektir: (karşılık gelen ASCII kodları dönüştürme 0ve 1ikili, ayrı bir satırda her kelime)

00110001 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00000000 00000000 00000000

Dört karakter bir kelimeye sığar, geri kalanı bir sonrakine taşınır. Geri kalan her şey (ilk NULL byte dahil) uyuyana kadar bir sonraki kelimeye taşınır.

Şimdi, sayıları kaydetmeye geri dönelim. Tıpkı taşan metinlerde olduğu gibi çalışır, ancak sağdan sola takılırlar. Kulağa karmaşık gelebilir, işte bir örnek. Sadelik uğruna, farz edelim ki:

  • hayali bilgisayarımız ikili yerine ondalık kullanıyor
  • bir bayt sayı tutabilir 0..9
  • bir kelime iki bayttan oluşur

İşte boş 2 kelimelik bir hafıza:

0 0
0 0

4 sayısını saklayalım:

0 4
0 0

Şimdi 9 ekleyelim:

1 3
0 0

Her iki işlenenin de bir bayt sığabileceğine dikkat edin, ancak sonuçta değil Ama kullanıma hazır başka bir tane var. Şimdi 99'u depolayalım:

9 9
0 0

Yine, numarayı kaydetmek için ikinci bayt kullandık. 1 ekleyelim:

0 0
0 0

Boğmaca ... Buna tamsayı taşması denir ve bazen çok pahalı olan birçok ciddi sorunun nedenidir .

Ancak taşma olacağını umarsak, şunu yapabiliriz:

0 0
9 9

Ve şimdi 1 ekleyin:

0 1
0 0

Bayt ayırma boşluklarını ve yeni satırları kaldırırsanız daha net olur:

0099    | +1
0100

Taşma olabileceğini ve ek belleğe ihtiyacımız olabileceğini tahmin ettik. Rakamların bu şekilde kullanılması, tek kelimelere uyan sayılar kadar hızlı değildir ve yazılımda uygulanması gerekir. 32-bit CPU'ya iki-32-bit-word-sayı desteği eklemek etkili bir şekilde 64-bit CPU'dur (şimdi 64-bit sayılarda doğal olarak çalışabilir mi?).

Yukarıda anlattığım her şey, 8-bit bayt ve 4-byte kelimeli ikili hafızaya da uygulanıyor, hemen hemen aynı şekilde çalışıyor:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111    | +1
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

Bu sayıları ondalık sisteme dönüştürmek zor olsa da. (ama onaltılık ile oldukça iyi çalışıyor )


21
Cevabınız oldukça küçümseyerek okuyor. OP açıkça sayı, metin olarak değil bahsediyor: large as the number 1 trillion (1000000000000). Ayrıca, neredeyse keyfi bir aritmetikten bahsediyorsun , ama söylediklerinin hiçbir teriminden bahsetmiyorsun ....
MirroredFate

12
"1 trilyon" aynı zamanda bir dizedir
Elzo Valugi

3
@ElzoValugi Öyle. Bir sayıyı temsil eden dize yerine soyut sayı kavramını sunmanın bir yolunu bulmalıydım. "1 trilyon" un bunu yapmanın daha iyi ve daha az belirsiz bir yol olduğuna inanıyorum (cevaptaki kanıtı görün).
gronostaj

25
@MirroredFate Ben 'kesinlikle sayı hakkında konuşuyor' ile katılmıyorum. OP açıkça getiren 'ince görüntülenen' diyor olduğunu ... bana metnin '1000000000000' bahsediyor
Joe

4
@yannbane 'A' sayı değil, karakterdir. '?' karakter değil, sayı değil. '1' bir karakterdir, sayı da değildir. Karakterler sadece sembollerdir. Rakamları veya sayıları temsil edebilirler, ancak kesinlikle sayı değildir. '1' bir, on, yüz, bin vb. İçin dayanabilir, bu sadece bir sayı ya da onun parçası olabilecek bir basamağın anlamına gelen bir sembol. '10' (karakter dizisi) iki ya da sekiz ya da on ya da on altı vb. Anlamına gelebilir, ancak on elmaya sahip olduğunuzu söylerken on numara kullanıyorsunuz ve herkes ne demek istediğinizi biliyor. Karakterler ve sayılar arasında büyük bir fark var.
gronostaj

40

Bilgisayarınız çökmeden "BU BİLDİRİM YANLIYOR" da yazabilirsiniz :) @ Scott'ın cevabı belirli hesaplama çerçeveleri için dikkat çekicidir, ancak çok sayıda "yazma" sorunuz en azından şu ana kadar yorumlanır.

Düzenleme: Şimdi ile daha az alay farklı yolları hakkında daha fazla yararlı bilgiler bir numara hafızada saklanabilir. Bunları daha yüksek soyutlamalarla açıklayacağım, yani modern bir programcının yürütme için makine koduna çevrilmeden önce kod yazabileceği anlamında.

Bilgisayar üzerindeki veriler belli sınırlı gereken tip (yani metni sıralamak veya bir boolean XOR, sayıları karşılaştırın) ve böyle türde bir bilgisayar tanımı işlemleri bu veri ve nasıl yapılabilir açıklar. Bir sayıya metin ekleyemezsiniz, tıpkı bir sayıyı metin ile çarpamayacağınız gibi, bu değerlerin bazıları türler arasında dönüştürülebilir.

İmzasız tamsayılarla başlayalım . Bu değer türlerinde, tüm bitler basamaklarla ilgili bilgileri depolamak için kullanılır; sizin bir örneğidir 32-bit işaretsiz tam sayı herhangi bir değeri 0için 2^32-1saklanabilir. Ve evet, kullanılan platformun diline veya mimarisine bağlı olarak, 16 bit tam sayıları veya 256 bit tam sayıları olabilir.

Ya olumsuz almak istersen? Sezgisel olarak, işaretli tamsayılar oyunun adıdır. Kongre tüm değerleri tahsis etmektir -2^(n-1)için 2^(n-1)-1iki yazma yolları ile uğraşmak zorunda karışıklığı önlemek Bu şekilde - +0ve -0. Yani bir 32 bitlik imzalı tamsayı bir değer yapacağını -2147483648için 2147483647. Düzgün değil mi?

Tamam, ondalık bileşeni olmayan sayılar olan tam sayıları ele aldık. Bunları ifade etmek daha zordur: tamsayı olmayan kısım, sadece 0ve arasında bir yerde olabilir 1, bu yüzden onu tanımlamak için kullanılan her bir bit, hassasiyetini artıracaktır: 1/2, 1/4, 1/8 ... Sorun, sen, tam olarak basit bir ondalık basamağı 0.1, paydalarında sadece ikisinin güçleri olabilecek kesirlerin toplamı olarak ifade edemezsiniz! Sayıyı bir tamsayı olarak saklamak daha kolay olmaz mıydı, bunun yerine radix (ondalık) noktasını koymayı kabul ettin mi? Buna sabit nokta numaraları denir , burada saklıyoruz 1234100ancak 1234.100bunun yerine okumak için bir anlaşmaya katılıyoruz .

Hesaplamalar için kullanılan nispeten daha yaygın bir türdür floating point. Çalışma şekli gerçekten düzgün, işaret değerini saklamak için bir bit, daha sonra üstel ve önemini saklamak için bir bit kullanır. Bu tür tahsisleri tanımlayan standartlar var, ancak 32 bitlik bir float için saklayabileceğiniz maksimum sayı çok zor

(2 - 2^-23) * 2^(2^7 - 1) ≈ 3.4 * 10^38

Ancak bu, hassasiyetin bedeli olarak gelir. Tarayıcılarda bulunan JavaScript 64-bit float kullanır ve hala doğru şeyler alamıyor. Bunu adres çubuğuna kopyalayın ve enter tuşuna basın. Spoiler uyarısı: Sonuç edilir değil olacaktı 0.3.

javascript:alert(0.1+0.2);

BigIntegerTeorik olarak üst ya da alt sınırlara sahip olmayan ve "gruplar halinde" hesaplanması gereken Microsoft .NET 4.5'ler gibi daha alternatif türler vardır; ama belki de daha büyüleyici teknolojiler, matematiği anlayan teknolojilerdir, Wolfram Mathematica motoru gibi, sonsuzluk gibi soyut değerlerle tam olarak çalışabilirler .


8
Bunu bu gerçeklikte yapabilirsiniz. Bunu Star Trek evreninde yapmayı deneyin. Tüm kıvılcımlar ve duman nedeniyle sadece geri çekilin.
Michael Petrotta

Bu tam olarak sabit nokta nasıl çalıştığını değil. Aslında sayıların ölçeklendirildiği ve ondalık nokta üretmek için önyargılı bir sistemdir. Örneğinizde ölçek 1/1000'dir, ancak bunun gibi sabit nokta sayıları da vardır (özellikle bilgisayar grafiklerinde): 0 = 0.0, 255 = 1.0 - ölçek 1/255'tir.
Andon M. Coleman

31

Anahtar, bilgisayarların sayıları nasıl kodladığını anlamaktır .

Bir bilgisayar, sayıları basit bir ikili gösterimi kullanarak tek bir sözcük kullanarak (32 bit sistemde 4 bayt) sayıları kaydetmekte ısrar ederse, 32 bitlik bir bilgisayar yalnızca 2 ^ 32'ye kadar sayıları depolayabilir. Ancak, onlarla ne elde etmek istediğinize bağlı olarak sayıları kodlamanın başka yolları da vardır.

Bir örnek, bilgisayarların kayan nokta sayılarını nasıl sakladığıdır. Bilgisayarlar onları kodlamak için bir sürü farklı yol kullanabilirler. IEEE 754 standardı , 2 ^ 32'den büyük numaraların kodlanması için kuralları tanımlar. Kabaca, bilgisayarlar bunu 32 bitin, sayının bazı hanelerini temsil eden farklı bölümlere ve sayının boyutunu temsil eden diğer bitlere (yani, üs, 10 ^ x) ayırarak uygulayabilir . Bu, çok daha geniş bir aralık sağlarsayı cinsinden sayıların sayısı, ancak kesinliği tehlikeye atar (bu birçok amaç için uygun değildir). Tabii ki bilgisayar, bu kodlama için, mevcut kodlanmış sayıların büyüklüğünün hassasiyetini artıran, birden fazla kelime de kullanabilir. IEEE standardının basit ondalık 32 sürümü, yaklaşık 7 ondalık basamaklı sayılara ve yaklaşık 10 ^ 96 büyüklüğe kadar sayılara izin verir.

Ancak, ekstra hassasiyete ihtiyacınız varsa birçok seçenek var. Açıkçası, kodlamada sınırsız olarak daha fazla kelime kullanabilirsiniz (kodlu formata dönüşme ve performans dışında bir performans cezası olsa da). Bunu yapmanın bir yolunu keşfetmek istiyorsanız, hesaplamada yüzlerce basamak hassasiyetine izin veren bir kodlama şeması kullanan Excel için harika bir açık kaynaklı eklenti vardır. Eklenti Xnumbers olarak adlandırılır ve burada bulunur . Kod, Visual Basic'te mümkün olan en hızlı değil ancak anlaşılması ve değiştirilmesi kolay bir avantaja sahip. Bilgisayarların daha uzun sayıları nasıl kodladıklarını öğrenmenin harika bir yoludur. Ayrıca herhangi bir programlama aracı yüklemek zorunda kalmadan Excel'deki sonuçlarla oynayabilirsiniz.


24

Hepsi senin sorunda.

İstediğiniz herhangi bir sayıyı kağıda yazabilirsiniz . Beyaz bir kağıda trilyon nokta yazmayı deneyin. Yavaş ve etkisiz. Bu yüzden bu büyük sayıları temsil etmek için 10 basamaklı bir sistemimiz var. Hatta "milyon", "trilyon" ve daha fazlası gibi büyük rakamlar için isimlerimiz bile var one one one one one one one one one one one...;

32 bit işlemciler, tam olarak 32 ikili basamak uzunluğundaki bellek bloklarıyla en hızlı ve verimli çalışacak şekilde tasarlanmıştır. Fakat biz insanlar genelde 10 basamaklı sayısal sistemi kullanıyoruz ve elektronik olan bilgisayarlar ise 2 basamaklı sistemi ( ikili ) kullanıyoruz. 32 ve 64 sayıları sadece 2'nin gücüne sahip oluyor. Yani bir milyon ve bir trilyon 10'luk güçlere sahip. Bu rakamlarla çalışmak bizim için örneğin 65536'nın katlarından daha kolay.

Kağıda yazarken büyük rakamları rakamlara böleriz. Bilgisayarlar sayıları daha fazla sayıya böler. İstediğimiz herhangi bir sayıyı yazabiliriz ve eğer tasarlarsak bilgisayarlar da olabilir.


15

32bit ve 64bit, hafıza adreslerini ifade eder. Bilgisayarınızın hafızası postane kutuları gibidir, her birinin farklı bir adresi vardır. CPU (Merkezi İşlem Birimi) bu adresleri RAM'inizdeki bellek konumlarını (Rasgele Erişim Belleği) adreslemek için kullanır. CPU yalnızca 16bit adresleri kaldırabildiğinde, yalnızca 32 MB RAM kullanabilirsiniz (o zamanlar çok büyük görünüyordu). 32bit ile o zaman 4 + gb (ki o zamanlar dev gibi görünüyordu). Şimdi 64bit adrese sahip olduğumuz için RAM terabayta giriyor (ki bu çok büyük görünüyor).
Bununla birlikte, program, sayı ve metin depolamak, programa bağlı olan ve her adresin büyüklüğü ile ilgili olmayan şeyler için birden fazla bellek bloğu tahsis edebilir. Böylece bir program CPU'ya söyleyebilir, 10 adres bloğu saklama alanı kullanacağım ve daha sonra çok büyük bir sayı ya da 10 harfli bir dizi ya da her neyse saklayacağım.
Yan not: Bellek adresleri "işaretçiler" ile gösterilir, bu nedenle 32 ve 64 bit değeri, belleğe erişmek için kullanılan işaretçinin boyutu anlamına gelir.


2
Detaylar dışında iyi cevap - 16 bit adres alanı, 32 MB değil 64 kb, ve 286 gibi makinelerde 24 bit adrese sahipti (16 MB için). Ayrıca, 64-bit adreslerle, terabaytların ötesine geçiyorsunuz - 16 exabayt gibi - terabaytlar, mevcut neslin anakartlarının / CPU'larının belirlediği sınırların türünde - adreslerin boyutu değil.
Phil

4
32 bit, bellek adreslerini değil makine kelimesini belirtir. Phil'in bahsettiği gibi, 286 16-bit CPU'ydu ancak bellek bölümleme yoluyla ele almak için 24 bit kullandı. x86 CPU'lar 32 bit, ancak 36 bit adresleme kullanır. PAE'ye bakınız .
gronostaj

@gronostaj kuyusu x86, 386'dan Pentium'a 32-bit adresleme özelliğine sahiptir.
Ruslan

Buradaki tek DOĞRU cevap bu çünkü çünkü 32bit - 32bit 32bit aritmetik değil 32bit bellek adresleme anlamına gelir.
user1207217

@ user1207217: ?? Yani nedene göre, örneğin Z80 veya 8080, 16-bit işlemcilerdir (16-bit bellek adresleme ve bellek veriyolu nedeniyle)?
pabouk

13

Çünkü sayının gösterilmesi, tam sayılar değil, tek tek karakterler kullanılarak yapılır. Sayıdaki her rakam, tamsayı değeri kullanılan kodlama ile tanımlanmış olan, örneğin 'a'ascii değeriyle temsil 97edilirken '1', temsil edilen ayrı bir karakter bilgisiyle temsil edilir 49. Buradaki ascii masasını kontrol edin .
Hem 'a' hem de '1' görüntülemek için aynıdır. Onlar tam anlamıyla değil, karakter değişmezleridir. Her karakter değişmezinin, değeri 8 bit veya 1 bayt boyutunda depolayan 32 bit platformda maksimum 255 değerine sahip olmasına izin verilir (bu platforma bağlıdır, ancak 8 bit en yaygın karakter boyutudur), böylece birlikte gruplanabilirler ve görüntülenen. Ne kadar ayrı karakter gösterebilecekleri, sahip olduğunuz RAM'e bağlıdır. Yalnızca 1 bayt RAM'iniz varsa, yalnızca bir karakter görüntüleyebilirsiniz, 1GB RAM'iniz varsa, 1024 * 1024 * 1024 karakter (matematiği yapmak için çok tembel) iyi görüntüleyebilirsiniz.

Ancak bu sınırlama hesaplamalar için geçerlidir, ancak IPV4 standardıyla ilgilendiğinizi tahmin ediyorum. Her ne kadar tamamen bilgisayarlarla ilgili olmasa dabit-size, bir şekilde standartları etkiledi. IPV4 standardı oluşturulduğunda, ip değerlerini 32 bit tam sayılarda saklarlar. Şimdi bir kez boyutunu verdin ve standart oldu. İnternet hakkında bildiğimiz her şey buna bağlıydı ve sonra atamak için IP adresleri tükendi. Dolayısıyla, IP standardı 64 bit olacak şekilde revize edildiyse, yönlendiriciniz (bunun doğru olduğunu varsayıyorum) ve diğer ağ aygıtları da dahil olmak üzere her şey çalışmayı durdurur. Dolayısıyla, 32 bit tamsayıyı 128 bit olanla değiştiren yeni bir standart yaratılmalıdır. Ve standardın geri kalanı ayarlandı. Donanım üreticisinin yalnızca bu yeni standardı desteklediklerini ve viral olacağına karar vermesi gerekir. O kadar basit olmasa da, burada bir noktaya değindin sanırım.

Feragatname: Burada belirtilen hususların çoğu benim varsayımım için geçerlidir. Daha basit hale getirmek için burada önemli noktaları özlemiş olabilirim. Rakamlarla iyi değilim, bu yüzden bazı rakamları kaçırmış olmalıyım, ancak buradaki amacım OP'nin PC'yi neden çökmeyeceği konusundaki cevabını cevaplamak.


2
Henüz oy kullanmadım, ancak cevabınızla ilgili bir takım problemler var. 10x1 değil ASCII’de 0x31’dir. 1 GB = 1024 ^ 3 B. 32 bit CPU'lar tanıtılmadan önce IPv4 düğmesi icat edildi, bu nedenle adreslerin 32 bit tam sayılarda depolandığını söylemek OP sorusuyla çelişiyor. Ve son olarak IPv6 64-bit değil, 128-bit adresleri kullanıyor.
gronostaj,

13

İşlemcilerde "kelimeler" var. Farklı kelimeler var. İnsanlar "32 bit işlemci" derken, çoğunlukla "bellek veri yolu genişliği" anlamına geliyorlar. Bu kelime, iletime (24 bit) ve kontrolüne (diğer bitler) karşılık gelen bilgisayarın alt sistemlerini ifade eden farklı "alanlardan" oluşur. Kesin sayılar konusunda yanılmış olabilirim, kılavuzlardan emin olabilirsiniz.

Tamamen farklı bir yön hesaplamadır. SSE ve MMX komut setleri uzun tamsayıları saklayabilir. Verimlilik kaybı olmadan maksimum uzunluk mevcut SSE versiyonuna bağlıdır, ancak her zaman 64 bit'in bir katıdır.

Mevcut Opteron işlemciler 256 bit genişlikteki sayıları kullanabilir (tamsayı olduğundan emin değilim, ancak kesin olduğundan eminim).

Özet : (1) veri yolu genişliği doğrudan hesaplama genişliğine bağlı değildir, (2) farklı kelimeler bile (bellek kelimesi, kayıt kelimesi, otobüs kelimesi vb.) Birbirlerine bağlı değildir, diğerlerinden 8 veya 16 veya 24. Birçok işlemci 6 bitlik bir kelime bile kullandı (ancak tarihi).


Doğru değil, orijinal Pentium işlemcide 32 bit işlemci olmasına rağmen yüksek bellek bant genişliği için 64 bit veri yolu bulunuyordu. 8088, 8 bitlik bir veri yoluna sahip 16 bit bir işlemciydi.
doug65536

10

Bir hesaplama cihazının amacı genellikle verileri kabul etmek, işlemek, saklamak ve yaymaktır. Temel donanım yalnızca bu dört işlevi yerine getiren bir makinedir. Yazılım olmadan hiçbirini yapamaz.

Yazılım, makineye verinin nasıl kabul edileceğini, nasıl işleneceğini, nasıl depolanacağını ve başkalarına nasıl sağlanacağını söyleyen koddur.

Temel donanım her zaman sınırlamalara sahip olacaktır. 32 bitlik bir makinede, verileri işleyen kayıtların çoğu sadece 32 bit genişliğindedir. Bu, makinenin 2 ^ 32'nin üzerindeki sayıları idare edemeyeceği anlamına gelmez, bunun anlamı, daha büyük sayılarla uğraşmak istediğinizde, makinenin kabul etmek, işlemek, saklamak için birden fazla döngü gerektirebileceği anlamına gelir ya da ya yay.

Yazılım, makineye numaraları nasıl kullanacağını söyler. Yazılım büyük sayıları işlemek için tasarlanmışsa, CPU'ya büyük sayıları nasıl kullanacağını söyleyen bir dizi talimat gönderir. Örneğin, numaranız iki adet 32 ​​bit kayıt tarafından temsil edilebilir. Numaranıza 1.234 eklemek istiyorsanız, yazılım CPU’ya ilk önce alt kayıt defterine 1.234 eklemesini, ardından bu eklemenin alt kayıt için çok büyük bir sayı ile sonuçlanıp sonuçlanmadığını görmek için taşma bitini kontrol eder. Olursa, üst sicile 1 ekler.

Aynı şekilde, ilkokul çocuklarına da beraberinde getirmeleri öğretilirken, CPU'ya tek bir sicilde tutabileceğinden daha büyük sayıları kullanması söylenebilir. Bu, çoğu genel matematik işleminde, herhangi bir pratik boyuttaki sayı için geçerlidir.


10

Aradaki fark, verileri bilgisayarlarda nasıl sakladığımızdır.

Teorik bir 8 bitlik bir makine için, 2 ^ 8 değerlerini yalnızca tek bir işlemci kaydında veya bellek adresinde saklayabildiğimiz konusunda haklısınız. (Bunun, kullanılan işlemciye, bellek mimarisine vb. Dayanarak "makine" den "makine" ye kadar değiştiğini lütfen unutmayın. Şimdilik, varsayımsal bir 'stereotip' makine kullanmaya devam edelim.)

Teorik 16 bitlik bir makine için, bir kayıt / bellek konumundaki maksimum değer 32 bitlik bir makine için 2 ^ 16, 2 ^ 32 vb. Olacaktır.

Yıllar boyunca, programcılar, tek bir işlemci kaydında veya bellek adresinde saklanabilecek miktardan daha büyük sayıları saklamak ve işlemek için her türlü chicanery'i tasarladılar. Pek çok yöntem vardır, ancak hepsi "yerel" kayıt / bellek konum genişliğinden daha büyük olan değerleri saklamak için birden fazla kayıt / bellek adresi kullanmayı içerir.

Bu yöntemlerin tümü, makinenin yerel kapasiteden daha büyük değerleri depolayabilmesi / işleyebilmesi bakımından faydalıdır. Dezavantajı neredeyse tüm yaklaşımlar çoklu makine talimatlarını / okuma / etc gerektirir. bu numaraları ele almak için. Arada sırada çok sayıda, bu bir sorun değil. İle uğraşırken bir sürü (özellikle büyük bellek adresleri) Büyük sayılar dahil havai şeyler yavaşlatır.

Bu nedenle, genel olarak kayıtlar, hafıza yerleri ve hafıza adresleme donanımı, "doğal" sayıları büyük ölçüde "doğal" olarak ele almak için donanım "geniş" ve daha geniş bir şekilde ele almakta, böylelikle bu sayılar minimum işlem sayısı ile idare edilebilmektedir.

Sayı boyutu sonsuz olduğundan, işlemci kaydı / bellek boyutu / adresleme her zaman yerel sayı boyutunun bir dengesidir ve daha büyük ve daha geniş genişliklerin uygulanmasında yer alan maliyetlerdir.


8

32 bit bilgisayarlar, 2 ^ 32'ye kadar olan numaraları tek bir makine kelimesinde yalnızca depolayabilir, ancak bu daha büyük veri varlıklarını kaldıramadıkları anlamına gelmez.

32 bitlik bir bilgisayarın anlamı genellikle veri yolunun ve adres yolunun 32 bit genişliğinde olması anlamına gelir; bu, bilgisayarın aynı anda 4 GB bellek adres alanını işleyebildiği ve veri yolundan bir seferde dört bayt veri gönderebileceği anlamına gelir .

Ancak bu, bilgisayarın daha fazla veri işlemesini sınırlamaz, yalnızca veri yolu üzerinden gönderildiğinde verileri dört baytlık parçalara bölmesi gerekir.

Normal Intel 32-bit işlemci dahili olarak 128-bit sayıları idare eder, bu sayede 100000000000000000000000000000000000000 'ü sorunsuz şekilde kullanabilirsiniz.

Bir bilgisayardaki sayıdan çok daha büyük sayıları işleyebilirsiniz, ancak daha sonra hesaplamaların yazılım tarafından yapılması gerekir; CPU 128 bitten büyük sayıları kullanma talimatına sahip değildir. (Kayan nokta sayıları biçiminde çok daha büyük sayıları işleyebilir, ancak o zaman yalnızca 15 basamak hassasiyetiniz vardır.)


6

Sadece diğer birçok cevaplara bir not ekleyelim, çünkü bu soru kaçırılmış olan çok önemli bir gerçektir.

"32 bit", hafıza adres genişliğini ifade eder. Kayıt büyüklüğü ile ilgisi yoktur. 32 bit işlemcilerin çoğunda muhtemelen 64 bit, hatta 128 bit kaydedici bulunur. Özellikle x86 ürün hattına atıfta bulunarak, 64bit olan son tüketici CPU'ları, özel amaçlar için 256 bitlik kayıtlara sahiptir.

Kayıt genişliği ile adres genişliği arasındaki bu fark, eski zamanlardan beri, 4 bitlik kayıtların ve 8 bitlik adreslerin olduğu veya bunun tersi olduğunda meydana gelmiştir.

Diğer cevaplarda açıklandığı gibi, büyük bir sayının kaydedilmesinin kayıt büyüklüğünden bağımsız olarak sorun olmadığını görmek kolaydır.

Hangi boyutta olursa olsun, kayıtların ek olarak daha büyük sayılarla da hesaplayabilmelerinin nedeni, çok büyük hesapların kayıtlara sığabilecek küçük hesaplara bölünebilmesidir (sadece biraz daha karmaşıktır) gerçekte).


Bu gerçekten doğru değil; 64 bit'in ifade ettiği şey tutarsızdır, ancak 64 bit kayıt genişliğine sahip sistemler genellikle 64 bit olarak adlandırılır. Wikipedia, "64 bit bilgisayar mimarisinin genellikle 64 bit genişliğinde tam sayı ve adresleme kaydına sahip olduğunu" söylüyor. Evet, modern x86 (veya AMD-64) ürün grubu çok özel amaçlı kayıtlara sahiptir, ancak 64 bitlik ana kayıtlara sahiptir ve 48-52 bit hafızaya erişebilirler; daha eski x86 sistemlerinde 32 bitlik ana kayıtlar var ve 24-36 bitlik belleğe erişiyorlardı ve 8086'ya 16 bitlik bir yonga deniyordu, 16 bitlik genişletilmiş kayıtlar vardı ve 20 bitlik belleğe erişiyordu.
prosfilaes

@prosfilaes Bu çok değerli bir bilgi, ben bunlardan bahsediyordum (Ben de sizin kadar ayrıntıları hatırlayamadım). Bu cevabı düzenlemek için çekinmeyin.
mafu

6

Zaten verilen cevaplar aslında oldukça iyi, ancak sorunu farklı yönlerden ele alma eğiliminde ve bu nedenle eksik bir tablo ortaya koyuyor. Ayrıca bence biraz fazla teknikler.

Öyleyse, sadece başka herhangi bir cevapta açıkça ifade edilmeyen ve açıkça ifade edilmeyen bir şeyi açıklığa kavuşturmak için ve hangi konunun temel noktası olduğunu düşünüyorum:

Sorunuzda birçok kavramı karıştırıyorsunuz ve bunlardan biri ("32 bit") aslında çeşitli farklı şeylere atıfta bulunabilir (ve farklı cevaplar farklı yorumlara sahip olmuştur). Bu kavramların hepsinin çeşitli hesaplama bağlamlarında kullanılan (veya mevcut) bit sayısıyla (1'ler ve 0'lar) ilgisi var (bununla kastettiğim şey aşağıdaki örneklerle açıklığa kavuşturulacaktır), ancak kavramlar başka türlü ilgisizdir .

Açıkça:

  • "IPv4 / 6", internette bilgilerin nasıl paketleneceğini ve yorumlanacağını tanımlayan bir dizi kural olan internet protokolünü ifade eder . IPv4 ve IPv6 arasındaki birincil (veya en azından en iyi bilinen) ayrım, IPv6'da adres alanının (yani ağdaki farklı konumlar arasında ayrım yapmak için kullanılabilecek adres grubunun) daha büyük olmasıdır. Bu, ağ üzerinden gönderilen her veri paketinde kaç bitin paketin göndereni ve hedeflenen alıcının tanımlanması için tahsis edildiğini (yani bir amaç için ayrılır ) ile ilgilidir.
    • Bilgi işlem dışı analoji: Her paket, salyangoz-posta yoluyla gönderilen bir mektup gibidir ve adres alanı, zarfın üzerine adres ve iade adresi yazarken "izin verdiğiniz" karakter sayısı kadardır.
    • Bu ana kadar cevapların hiçbirinde bahsettiğimi görmüyorum.
  • Bilgisayar hafızası "sözcükleri" (32 bit ve 64 bit) genellikle bir bilgisayarın kullandığı veya "düşündüğü" en küçük veri parçası olarak düşünülebilir. Bu veri parçaları, diğer veri parçalarını oluşturmak için bir araya gelir. metin parçaları veya daha büyük tamsayılar gibi.
  • 32-bit işaretçiler kelimeler olabilir veya olmayabilirler, ancak yine de atomik olarak işlem görürler (yani daha küçük bileşenlere parçalanamayan ayrı üniteler olarak). İşaretçiler, bir bilgisayarın bazı rasgele veri yığınlarının belleğine konumunu kaydedebildiği en düşük düzeyli yoldur. Bilgisayar tarafından kullanılan işaretçi boyutunun (veya gerçekten işletim sistemi tarafından) tek işaretçiyle erişilebilen bellek aralığını sınırladığını unutmayın; çünkü yalnızca bir işaretçinin "işaretleyebileceği" olası bellek yerleri vardır. işaretçinin kendisi için olası değerler olduğu için. Bu IPv4 olası internet adresleri aralığını sınırlar biçiminden benzer, ancak does notÖrneğin, belirli bir web sayfasında bulunabilecek veri miktarını sınırlandırın. Bununla birlikte, ibre boyut etmez olmayan işaretçi işaret hangi veri kendisinin kısıtlamaktadır. (Veri boyutunun işaretçi aralığını aşmasına izin veren bir şema örneği için, Linux'un inode işaretçi yapısını inceleyin . Bunun "işaretçi" kelimesinin normalden biraz daha farklı bir kullanım olduğuna dikkat edin, çünkü işaretçi genellikle içinde işaretçi anlamına gelir. rasgele erişim belleği, sabit disk alanı değil.)
    • Bilgi işlem dışı analoji: hmmmm .... bu biraz zor. Belki de kütüphane materyallerinin indekslenmesi için Dewey ondalık sistemi biraz benzerdir? Ya da herhangi bir indeksleme sistemi, gerçekten.
    • SiteNook'un cevabına bakınız .
    • Lütfen yukarıdaki işaretçiler hakkındaki açıklamamın bazı ince ayrıntıları sağladığını ve tartışmanın kesinlikle doğru olmadığını unutmayın. Ancak, programcıların doğrudan işaretçilerle çalıştığı programlama dillerinde, çizdiğim zihinsel mod genellikle pratik amaçlar için yeterlidir.
  • Bir bilgisayar "göstermek mümkün" olduğunu sayılar bilgisayarın donanım veya işletim sistemi tarafından sınırlı (pratik amaçlar için) değildir; başka herhangi bir metin gibi ele alınırlar.

Bunun "32 bit" ifadesi için kapsamlı bir yorum listesi olmadığına dikkat edin.

Ekstra kredi: Sayılarla bilgisayar belleğinin ilkel parçaları arasındaki çıplak kemikleri gerçekten felsefi olarak görmek için Turing makineleri hakkında biraz bilgi edinin .


IPv4 referansının IPv4 adreslerinin sayısının etkin bir şekilde imzalı bir 32 bit tamsayı uzunluğu ile sınırlı olduğunu, IPv6'nın ise 128 bit kullandığını ve bu nedenle daha fazla adres alabildiğini belirtmek olduğunu düşünüyorum.
Clonkex

@ Clonkex Muhtemelen, bu kesinlikle bir soru olmasa da, soru cümlesidir.
Kyle Strand,

5

Örneğin hesap makinesinde 1000000000000 yazarsanız, bilgisayar onu ondalık basamaklı gerçek tip numarası olarak hesaplar . Bahsettiğiniz 32 bitlik limit, ondalık sayı kullanmadan tüm Tam Sayı tür numaralarına daha fazla dokunuyor . Farklı veri türleri, bit / bayt almak için farklı yöntemler kullanır.

Tamsayı türü numaraları : Bu tablo, noktayı yakalamanıza yardımcı olabilir ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Bu, C ++ için sınırlara dokunuyor. Örneğin, Int64 tip numarasının -9223372036854775808 ila 9223372036854775807 arasındaki limitleri vardır.

Gerçek tip numaraları : Gerçek tip numaraları kayan nokta ve üs ile değer içerir ve çok daha büyük sayılar girebilirsiniz, ancak doğruluk / kesinlik sınırlıdır. ( Http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) C ++ yüzden muhtemelen girmek ya da bir sonuç numarası gibi olabilir, en fazla üs 308 sahip olarak, örneğin LDBL (büyük çift) için 9.999 x 10^308, size anlamına gelir teorik olarak 308 (+1) rakamdan 9ibaret ancak sadece 15 en önemli rakam bu haneyi temsil etmek için kullanılacak, geri kalanlar kaybedilecek, sınırlı hassasiyetten dolayı kullanılacaktır.

Ek olarak, farklı programlama dilleri vardır ve sayı limitlerinin farklı uygulamaları olabilir. Böylece, özel uygulamaların C ++ 'dan çok daha büyük (ve / veya daha kesin / kesin) sayıları işleyebileceğini hayal edebilirsiniz.


Bu "cevap" yanlıştır: hesap makineleri, kesme hatalarını önlemek için BCD sayı gösterimini kullanır. IE 0.1 ondalık, sonlu uzunluklu ikili sayı olarak doğru şekilde gösterilemez.
talaş

5

Tipik bir Linux sistemindeki kaç programın çok sayıda işleme ve çıktıya dayandığına dair pratik bir örnek almak isterseniz:

libgmp- GNU Çoklu Hassas Aritmetik Kütüphanesi , Linux sistemlerinde bu amaç için en yaygın kullanılan kütüphanedir. 2 ^ 80 ile 1000 arasında çarpma işleminin basit bir örneği:

#include <gmp.h>

// Each large integer uses the mpz_t type provided by libgmp
mpz_t a_large_number;
mpz_t base;
mpz_t result;

// Initalize each variable
mpz_init(a_large_number);
mpz_init(base);
mpz_init(result);

// Assign the number 2 to the variable |base|
mpz_set_ui(base, 2);

// Raise base^80 (2^80), store the result in |a_large_number|
mpz_pow_ui(a_large_number, base, 80);

// Multiply |a_large_number| by 1000, store the result in |result|
mpz_mul_ui(result, a_large_number, 1000);

// Finally, output the result in decimal and hex notation
gmp_printf("decimal: %Zd, hex: %ZX\n", result, result);

Bu yüzden temelde normal + - * / operatörleri kullanmakla aynıdır, sadece sayıları ayırmak ve bunları dahili olarak birden fazla makine kelimesi büyüklüğünde (yani 32-bit) sayı olarak saklamak için bir kütüphane ile aynıdır. Ayrıca, metin girişini tamsayı tiplerine dönüştürmek için scanf () tip fonksiyonları da vardır.

Yapısı mpz_ttam olarak Scott Chamberlain'ın iki eli kullanarak 6'ya kadar sayma örneği gibidir. Temel olarak bir makine kelimesi boyutunda mp_limb_ttürler dizisidir ve bir sayı bir makine kelimesine sığmayacak kadar büyük olduğunda, GMP mp_limb_t, sayının yüksek / düşük bölümlerini depolamak için çoklu kullanır .


5

Aklında sadece 10 farklı basamak var. 0 - 9 arası. Beyninizde dahili olarak, bu kesinlikle bir bilgisayardan farklı bir şekilde kodlanmıştır.

Bir bilgisayar sayıları kodlamak için bit kullanır, ancak bu önemli değildir. Bu sadece mühendislerin işleri kodlamak için seçtiği yol, ama bunu görmezden gelmelisin. Bunu 32 bitlik bir bilgisayarın 4 milyardan fazla farklı değere sahip benzersiz bir temsili olduğunu düşünebiliriz, biz ise insanlar 10 farklı değer için benzersiz bir temsile sahipler.

Ne zaman daha büyük bir sayı kavramamız gerektiğinde, bir sistem kullanıyoruz. En soldaki sayı en önemlisidir. Bir sonrakinden 10 kat daha önemli.

Dört milyar farklı değeri birbirinden ayırabilen bir bilgisayarın benzer şekilde, bir değer setinde en soldaki değeri, bu setteki bir sonraki değerden dört milyar kat daha önemli hale getirmesi gerekecektir. Aslında bir bilgisayar hiç umrunda değil. Rakamlara "önem" vermez. Programcılar bununla ilgilenmek için özel kodlar koymalıdır.

Ne zaman bir değer benzersiz sembollerin sayısından büyük olursa, insan zihninde 9, sola bir sayı eklersiniz.

3+3=6

Bu durumda, sayı hala tek bir "slot" içinde uyuyor

5+5=10. This situation is called an overflow.

Bu yüzden insanlar her zaman yeterince benzersiz sembollere sahip olmama sorunuyla ilgilenir. Bilgisayar bununla başa çıkmak için bir sisteme sahip değilse, fazladan bir sayı olduğunu unutmadan, basitçe 0 yazardı. Neyse ki, bilgisayarların bu durumda ortaya çıkan bir "taşma bayrağı" vardır.

987+321 is more difficult.

Okulda bir yöntem öğrenmiş olabilirsin. Bir algoritma. Algoritma oldukça basittir. En soldaki iki sembolü ekleyerek başlayın.

7+1=8, we now have ...8 as the result so far

Ardından bir sonraki yuvaya geçip aynı işlemi yapın.

8+2=10, the overflow flag is raised. We now have ...08, plus overflow.

Bir taşma olduğundan, bir sonraki sayıya 1 eklememiz gerektiği anlamına gelir.

9+3=12, and then we add one due to overflow. ...308, and we had another overflow.

Eklenecek başka numara yok, bu yüzden taşma bayrağı yükseltildiği için bir yuva oluşturup 1 ekleyeceğiz.

1308

Bir bilgisayar tam olarak aynı şekilde yapar, yalnızca 10 benzeri insan yerine 2 ^ 32 veya daha iyisi 2 ^ 64 farklı sembol vardır.

Donanım düzeyinde, bilgisayar tamamen aynı yöntemi kullanarak tek bitlerde çalışır. Neyse ki, bu programcılar için soyutlanmıştır. Bitler sadece iki hanedir, çünkü güç hattında gösterilmesi kolaydır. Işık yanıyor ya da sönük.

Son olarak, bir bilgisayar herhangi bir sayıyı basit bir karakter dizisi olarak görüntüleyebilir. Bilgisayarların en iyisi budur. Bir karakter dizisi ve dahili bir temsil arasında dönüştürme algoritması oldukça karmaşıktır.


In my aklında ben 36 biliyorum ama genellikle sadece bunlardan 16 kullanırlar.
Kyle Strand

'Bir bilgisayar sayıları kodlamak için bit kullanır, ancak bu önemli değildir.' Kullanıcı hakkında 32 bit kelime sormak ve 2 ^ 32-1'den büyük sayıları saklamak için nasıl kullanıldığını sormak çok önemlidir.
HörmannHH

Beyninizin hafızasındaki rakamları nasıl kodladığınız önemli değildir. Sınırlı sayıda temsiliniz var; çoğu 10 farklı sembol öğrendi. Beyninin içinde, bu muhtemelen binlerce nöron ve sinaps şeklinde temsil edilir. Bir bilgisayarda elektrik şeklinde veya elektrik hattında elektrik olmadan temsil edilir. Programlama açısından - veya matematik öğrenirken, doğrudan belirli bir CPU kümesi için programlama yaptığınız nadir durumlar dışında, hiç önemli değil. Bireysel bitler değil, 64 bit vs 64 bit soruyor.
Frodeborli

3

Çünkü bir sayı göstermiyorsunuz (bilgisayar söz konusu olduğu sürece), ancak bir dize veya rakam dizisi. Elbette, sayılarla ilgilenen bazı uygulamalar (hesap makinesi gibi, sanırım), böyle bir sayıyı kaldırabilir sanırım. Hangi hileleri kullandıklarını bilmiyorum ... Eminim diğer bazı daha ayrıntılı cevaplar bununla örtüşür.


0

Bu cevabın içeriğinin çoğu asıl olarak bu cevabdan geliyordu (daha önce yazılan soru diğerinin kopyası olarak işaretlenmişti). Bu yüzden 8 bitlik değerler kullanarak tartışıyorum (bu soru 32 bitlik değerler sorsa bile), fakat sorun yok çünkü 8 bitlik değerlerin kavramsal olarak anlaşılması daha kolay ve aynı kavramlar 32 bitlik aritmetik gibi daha büyük değerlere de uygulanıyor.

8 bitlik iki sayı eklediğinizde, alabileceğiniz en büyük sayı (0xFF + 0xFF = 1FE). Aslında, 8 bitlik iki sayıyı çarptıysanız, alabileceğiniz en büyük sayı (0xFF * 0xFF = 0xFE01) 16 bit, iki kez 8 bit olur.

Şimdi, bir x-bit işlemcinin sadece x-bitleri takip edebileceğini varsayıyor olabilirsiniz. (Örneğin, 8 bitlik bir işlemci yalnızca 8 bitin kaydını tutabilir.) Bu doğru değil. 8 bit işlemci, 8 bit parçalarda veri alır. (Bu "topaklar" tipik olarak resmi bir terime sahiptir: bir "kelime". 8 bitlik bir işlemcide, 8 bitlik kelimeler kullanılır. 64 bitlik bir işlemcide 64 bitlik kelimeler kullanılabilir.)

Bu nedenle, bilgisayara 3 bayt verdiğinizde:
Bayt # 1: Çok
Yönlü Bayt # 2: Yüksek Sıralı Bayt (örneğin, 0xA5)
Bayt # 3: Düşük Sıralı Bayt (örneğin, 0xCB)
Bilgisayar, şu sonucu verebilir: 8 bitten fazla. CPU şöyle sonuçlar verebilir:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Şimdi, şunu yorumlayayım:
0x sadece aşağıdaki sayılar onaltılık anlamına gelir.
"40" ı anlık olarak daha ayrıntılı olarak tartışacağım.
82, 8 bitlik bir seri olan "A" kaydının bir parçasıdır.
xx ve xx, "B" kaydı ve "C" kaydı olarak adlandırılan diğer iki yazmacın parçasıdır. Bu bitleri sıfır veya bitlerle doldurmamamın nedeni, bir "ADD" komutunun (CPU'ya gönderilen) komutların değişmemesiyle sonuçlanabilmesidir (oysa bu örnekte kullandığım diğer bitlerin çoğu, bazı bayrak uçları hariç, değişmiş olsun).
D7 "D" sicil adı verilen daha fazla bit sığacaktır.
Bir kayıt sadece bir hafıza parçasıdır. Kayıtlar CPU'ların içine yerleştirilmiştir, böylece CPU bir RAM çubuğundaki hafıza ile etkileşime girmeden kayıtlara erişebilir.

Yani 0xA5 kez 0xCB'nin matematiksel sonucu 0x82D7'dir.

Şimdi, neden bitler A ve B kayıtları veya A ve D kayıtları yerine A ve D kayıtlarına bölündü? Bir kez daha, bu benim kullandığım örnek bir senaryo, kavram olarak gerçek bir Assembly diline oldukça benziyordu (Intel 8080 ve 8088 ve daha birçok CPU tarafından kullanılan Intel x86 16-bit). Genellikle sayma işlemleri için bir endeks olarak kullanılan "C" kaydı (döngüler için tipik) kullanılan bazı "C" kaydı ve bellek konumlarını belirlemeye yardımcı olan ofsetlerin kaydını tutmak için kullanılan "B" kaydı gibi bazı genel kurallar olabilir. Bu nedenle, "A" ve "D", ortak aritmetik fonksiyonların bazıları için daha yaygın olabilir.

Her CPU talimatı, Meclis'te program yapan kişiler tarafından kullanılan bazı belgelere sahip olmalıdır. Bu dokümantasyon, her bir talimat tarafından hangi kayıtların kullanılacağını belirtmelidir. (Bu nedenle hangi kayıtların kullanılacağına dair seçim genellikle Assembly dili programcıları tarafından değil, CPU tasarımcıları tarafından belirlenir. Buna rağmen, bir miktar esneklik olabilir.)

Şimdi, yukarıdaki örnekte "40" a geri dönelim: bu genellikle "bayrak kaydı" olarak adlandırılan bir dizi bit. Bayraklar kaydındaki her bitin bir adı vardır. Örneğin, sonuç, sonuçların bir baytını depolayabilecek alandan daha büyükse, CPU'nun ayarlayabileceği bir "taşma" biti vardır. ("Taşma" biti genellikle "OF" kısaltılmış ismi ile belirtilebilir. Bu sıfır değil, o büyük bir sermayedir.) Yazılım bu bayrağın değerini kontrol edebilir ve "sorunu" görebilir. Bu bit ile çalışmak genellikle görünmez bir şekilde üst düzey diller tarafından gerçekleştirilir, bu nedenle yeni başlayan programcılar genellikle CPU bayraklarıyla nasıl etkileşime gireceklerini öğrenmezler. Ancak, Meclis programcıları bu bayrakların bazılarına diğer değişkenlere çok benzeyen bir şekilde erişebilirler.

Örneğin, birden fazla ADD talimatınız olabilir. Bir ADD komutu, A kaydında ve D kaydında 16 bit sonuç saklayabilirken, diğer bir komut, yalnızca 8 düşük bit'i A kaydında saklayabilir, D kayıt defterini yok sayabilir ve taşma bitini belirtebilir. Ardından, (A kaydının sonuçlarını ana RAM'e kaydettikten sonra), sadece 8 yüksek bitini bir kayıt defterinde (muhtemelen A kayıt defteri) depolayan başka bir ADD talimatı kullanabilirsiniz (muhtemelen A kayıt defteri). Hangi çarpma talimatını kullandığınıza bağlıdır.

(İstediğiniz sonuca uyacak kadar fazla çıkarmanız durumunda, genellikle bir "akış" bayrağı da vardır.)

Sadece işlerin ne kadar karmaşık hale geldiğini göstermek için:
Intel 4004 4 bit işlemciydi
Intel 8008 8 bit işlemciydi. A, B, C ve D adında 8 bitlik kayıtları vardı
. Intel 8086, 16 bitlik bir işlemciydi. AX, BX, CX ve DX adında 16 bitlik kayıtlara sahipti.
Intel 80386 32 bit bir işlemciydi. EAX, EBX, ECX ve EDX adında 32-bit kayıtlara sahipti.
Intel x64 CPU'larında RAX, RBX, RCX ve RDX adında 64 bit kayıtlar bulunur. X64 yongaları 16 bitlik kodu çalıştırabilir (bazı işletim modlarında) ve 16 bitlik talimatları yorumlayabilir. Bunu yaparken, AX kaydını oluşturan bitler, RAX kaydını oluşturan bitlerin yarısı olan EAX kaydını oluşturan bitlerin yarısıdır. Böylece, AX'in değerini ne zaman değiştirirseniz, EAX ve RAX'ı da değiştirirsiniz, çünkü AX tarafından kullanılan bitler RAX tarafından kullanılan bitlerin bir parçasıdır. (EAX'i 65,536'nın çarpımı olan bir değerle değiştirirseniz, düşük 16 bit değişmez, böylece AX değişmez. EAX'i 65,536'nın çarpımı olmayan bir değerle değiştirirseniz, bu AX'i de etkiler. .)

Bahsettiğimden daha çok bayrak ve kayıt var. Basit bir kavramsal örnek sağlamak için sıkça kullanılanları seçtim.

Şimdi, eğer 8 bitlik bir CPU kullanıyorsanız, belleğe yazarken, 4 bit veya 16 bitlik bir adres değil, 8 bitlik bir adrese atıfta bulunma konusunda bazı kısıtlamalar bulabilirsiniz. Ayrıntılar CPU'ya bağlı olarak değişecektir, ancak bu tür kısıtlamalar varsa, CPU 8 bitlik kelimelerle ilgileniyor olabilir, bu yüzden CPU'nun en sık "8 bitlik CPU" olarak adlandırılmasının nedeni budur.


Cevabımın parçaları bu soruya verilen cevapların bir kısmını tekrar eder gibi hissediyorum. Ancak, içeriği ilk yazdığımda, başka bir soru için yazdığımdan bu fark edilmedi. Ayrıca, C dilindeki bazı kodlar da dahil olmak üzere Animism'in cevabını takdir ederken , içeriğimin CPU'nun fiili eylemlerine / tasarımına daha yakın olan Assembly'nin nasıl çalıştığı hakkında bazı detaylar sağladığını hissettim. Bu yüzden cevabım, diğerlerinden "daha iyi" olan, fakat sadece tamamlayıcı olan üstün bir cevap olmaya çalışmıyor; biraz daha içgörü ile başka bir bakış açısı daha eklemek
TOOGAM
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.