Bilgisayar, bir sayının diğerinden daha küçük veya daha büyük olup olmadığını nasıl belirler?


34

Aptalca bir soru gibi gelebilir ama bir bilgisayarın bunu nasıl bildiğini bilmek gerçekten merak ediyorum ? Ayrıca, bir bilgisayar tamsayının sırasının ve alfabenin A, B, C, D, ... olduğunu nasıl bilebilir ? Donanımda depolanan bir yer mi yoksa işletim sistemi bu tür bilgileri sağlıyor mu?1 , 2 , 3 , 4 , 5 , 1<21,2,3,4,5,...


1
Bu sorunun tatmin edici bir şekilde cevaplanması için, Ricky Stam'ın bilgisayar mimarisi hakkında ne kadar bildiğini bilmek zorunda kalacağız. Bu sorudan çok az gözüküyor, bu yüzden aşağıdaki şık cevapların hiçbiri onun için anlaşılamayacak.
Andrej Bauer

@AndrejBauer: Aslında soruyu sorduğundan beri oturum açmadı. Belki şimdi tek ihtiyacı olanı biliyordur.
Dave Clarke,

Yanıtlar:


31

Öncelikle tamsayı numaralarınız ikili sayılara dönüştürülür. Örneğin, 2 numaralı tam sayı 0010'a dönüştürülmüştür.

CPU dijital karşılaştırıcı kullanır :

Bir Dijital mukayese veya büyüklük karşılaştırıcısı ikili biçimde girdi olarak iki rakam alır ve bir numara ya da başka bir numaraya eşit ya daha büyük ya da daha az olup olmadığını belirleyen bir donanım elektronik cihaz.

Karşılaştırıcılar merkezi işlem ünitelerinde (CPU) ve mikrodenetleyicilerde kullanılır.

Kaynak: https://en.wikipedia.org/wiki/Digital_comparator

Karşılaştırma donanımında bazı kapılar kullanılır (AND, OR, NAND, NOR, XOR, vb.). Bu kapılar ikili girişleri alır ve ikili olarak sonuç verir. Çıktı bir doğruluk tablosundan görülebilir.

Inputs           Outputs
A   B     A>B    A=B    A<B
0   0     0       1      0
0   1     0       0      1
1   0     1       0      0
1   1     0       1      0

İşte 0ve 1geçit için elektronik gerilimler.
1- Bazı pozitif voltajları gösteren bazı eşik voltajlarını gösterir.
0- Eşiğin altındaki voltajı gösterir.

Örneğin, bir karşılaştırıcının 5 voltta çalıştığını varsayalım (açıklama için dikkate alınmalıdır): O zaman:
3 volt'tan daha yüksek voltaj olarak kabul edilebilir binary-1.
3 volt altındaki voltajbinary-0

Bir geçit 3.5 voltluk bir girişi ve 2 voltluk bir girişi alırsa, o zaman bir girişi ikili 1 ve başka bir girişi ikili 0 olarak alır.

Bu 1 ve 0 dizileri, anahtarlama devresi üzerinden çok hızlı bir şekilde sağlanır.

İki bitlik bir dijital karşılaştırıcının çalışması bir doğruluk tablosu olarak ifade edilebilir:

 Inputs                            Outputs
   A1   A0  B1  B0  A>B    A=B   A<B        
    0   0   0   0    0      1     0
    0   0   0   1    1      0     0
    0   0   1   0    1      0     0
    0   0   1   1    1      0     0
    0   1   0   0    0      0     1
    0   1   0   1    0      1     0
    0   1   1   0    1      0     0
    0   1   1   1    1      0     0
    1   0   0   0    0      0     1
    1   0   0   1    0      0     1
    1   0   1   0    0      1     0
    1   0   1   1    1      0     0
    1   1   0   0    0      0     1
    1   1   0   1    0      0     1
    1   1   1   0    0      0     1
    1   1   1   1    0      1     0

Wikipedia'dan alıntı yapmak için :

Örnekler: İki adet 4 bitli ikili sayı A ve B'yi göz önüne alın,
görüntü tanımını buraya girin
görüntü tanımını buraya girin
burada Her bir alt simge, sayıdaki rakamlardan birini gösterir.

eşitlik

Her iki sayının önemli basamaklarının tüm çiftleri eşit ise, yani A ve B ikili sayıları eşit olacaktır
görüntü tanımını buraya girin. görüntü tanımını buraya girin. görüntü tanımını buraya girin. görüntü tanımını buraya girin

Numaraları ikili olduğundan, rakam, 0 ya da 1 ve herhangi iki basamak eşitliği boolean işlevi ya olan görüntü tanımını buraya girinve> görüntü tanımını buraya girinolarak ifade edilebilir
görüntü tanımını buraya girin

görüntü tanımını buraya girin 1 ise sadece görüntü tanımını buraya girinve görüntü tanımını buraya girin eşittir.

A ve B'nin eşitliği için, tüm görüntü tanımını buraya girindeğişkenler (i = 0,1,2,3 için) 1 olmalıdır. Böylece, A ve B'nin kalite koşulu,
görüntü tanımını buraya girin
ikili işlem olarak AND işlemi kullanılarak (A = B) uygulanabilir. sadece iki sayının tüm basamak çiftleri eşit ise 1'dir.

Eşitsizlik

İki ikili sayının daha büyük olanını manuel olarak belirlemek için, en önemli bitten başlayarak, bir eşitsizlik bulunana kadar yavaş yavaş daha düşük önemli bitlere doğru ilerleyen önemli basamak çiftlerinin göreceli büyüklüklerini kontrol ederiz. Eşitsizlik bulunduğunda, karşılık gelen A'nın 1 olması ve B'ninki 0 olması durumunda, A> B olduğu sonucuna varırız. Bu sıralı karşılaştırma mantıksal olarak şu şekilde ifade edilebilir:

görüntü tanımını buraya girin


2
Whoa, burada neler oluyor?
Gilles 'SO- kötülük yapmayı bırak'

1
"İlk önce tamsayı sayılarınız ikili sayılara dönüştürülür" ... yanlış, ilk etapta sadece ikilik sayılar var, bunların hepsi makine seviyesinde 1 ve 0 sayıları, yani "dönüştürme" yok, 2 baştan sona 10 olarak temsil edildi ..
Dr.Haimovitz

Materyali diğer kaynaklardan kopyalarken kaynaklarınız için uygun bir nitelik sağlamalısınız. Buraya ve buraya bakın .
DW

İki bitlik dijital karşılaştırıcı tablosu yanlıştır. ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdf A1, A0 ikisi de sıfır iken, B0 ve B1 0, 1 A> B 0 olur, örneğin.
user1455116

14

Sadece “bilmez”, her seferinde kontrol eder. Temel olarak, yapacağınız şeyi yapar: Karşılaştırma yapmak için, hangi rakamın, diğer rakamdaki karşılık gelen rakamdan daha büyük olan ilk haneye sahip olduğunu (soldan) kontrol eder. Tabii ki daha kısa sayıya baştaki sıfır eklemek zorundasınız.

Harfler sadece bilgisayarın sayılarıdır. İnsanlar harflere örneğin ASCII veya Unicode gibi sayılar atadı, böylece sayı karşılaştırmaları da harfler için "doğru" sırayı verdi.


Ayrıca, bu genellikle " sözlükbilim düzeni " olarak adlandırılır . Bunu genellikle ilk önce uzunluğa göre (en kısadan en uzuna), sonra alfabetik olarak sıralayabiliriz.
usul

@ usul Bu bana tamsayıları karşılaştırmanın özelliklerinin açıkça belirli kodlamaya bağlı olduğunu hatırlatıyor; tanımladığım şey, gerçek bir CPU'nun kullanımından çok uzakta olabilecek "saf" ikili sayılar için işe yarıyor.
Raphael

Evet, kesinlikle. Turing Makineleri hakkında son zamanlarda çok düşündüm :). Gerçek makineler her zaman burada söylediklerimize tam olarak uymuyor ....
usul

9

Tamsayıları karşılaştıran işletim sistemi değil, CPU onunla ilgileniyor. Mantıksal kapı seviyesinde yapılır, nasıl yapılabileceğini görmek için lütfen bu slaytlara bakın.

Alfabe hakkında, ASCII'de alfanümerik ve diğer özel karakterler tamsayılar olarak temsil edilir, böylece bunları karşılaştırmak aynı zamanda CPU tarafından gerçekleştirilen bir tamsayı karşılaştırma işlemidir.


4

Aslında tam görüntüsünü elde etmek için, gerçek bir CPU veri yolunu, örneğin MIPS'yi kendi gözlerinizle görmenin oldukça yararlı olacağını düşünüyorum: görüntü tanımını buraya girin

Gördüğünüz gibi, aslında Sıfır adlı bir sinyal olan ALU'dan ikinci bir çıktı var. Bir programdaki karşılaştırmaların çoğu dallar hakkında olduğu için, karşılaştırmanın iki işlecinin sıfıra eşit olup olmadığını belirledikten sonra hızlı dal işlemleri gerçekleştirmek için var olur . Bu nedenle, kodunuzda bir şube olasılığı oluşturduğunuzda aşağıdaki gibi:

if (a <b) {...}

  

Sıfır sinyalinin, Program Sayacının (PC) değerini nereden alacağını belirleyen VE geçit girişlerinden biri olduğuna dikkat edin: Şube işlemimiz olduğu için Şube sinyalinin '1' olduğunu varsayalım.

Umarım "motor kapağının altında" görmenize yardımcı oldum. Bu konuda daha fazla analiz istemekten çekinmeyin. Aldığımız birçok şey, CPU'lar onları çok etkileyici bir şekilde yapıyor!


Ethan, "daha az" işlemi bu veri yolunda nasıl çalışıyor? Anladığım kadarıyla işlemi "eşit değil" olarak tanımladınız. "Slt" komutu ne işe yarar?
osgx

2

Gerçek bir CPU'nun nasıl yaptığını bilmek istiyorsanız, bunun gibi bir şey var.

Bir işlemci yalnızca belirli bir boyuta kadar sayılarla çalışır. Günümüzde bu genellikle 64-bit tam sayılardır (kayan noktalı sayıları görmezden geleceğiz; fikir benzer olacaktır).

Yani bunu anlamalıyız

  1. Bir CPU, 64 bit uzunluğundaki (örneğin 2 bit -tamamlayıcı, ancak ikili ne olursa olsun, çok fazla önemli değildir ) sayılarını saklar .

  2. Bir CPU doğal olarak bundan daha büyük sayılarla hiçbir şey yapamaz. Daha büyük sayıları karşılaştırmak istiyorsak yazılım algoritmaları yazmalıyız.

birb

bir-bbir-bsıfırdan daha az. Bunu, devre düzeyinde, diğer cevapların tanımladığı karşılaştırma algoritmaları gibi çalışabilecek tek bir yerel işlemle yapar. Buna benzeyecek, ancak hepsi devrelerde uygulanacak (sayı maksimum 64 bit olduğundan, bu işlem CPU üzerinde sabitlenip bağlanabileceğimiz kesin boyutta bir devredir.) İşlemcinin sayıları nasıl sakladığına bağlı olarak daha hızlı olabilir çünkü tüm negatif sayıların ilk biti veya buna benzer bir ayarı olabilir. Her iki durumda da toplam 64 bit var, bu yüzden bu sayının negatif olup olmadığını kesinlikle kontrol edebiliriz.

bir<bbirb

Şimdi, daha büyük sayılar için, bu küçük karşılaştırmaları alt yordamlar olarak kullanacak yazılımda bir şeyler uygulamak zorundayız.


1

Bu soruyu cevaplamak için öncelikle bilgisayardaki, makine düzeyinde ve yazılım düzeyindeki karşılaştırma numaralarının soyutlanmasında en az iki seviye olduğunu belirteyim .

Makine seviyesindeki sayıların karşılaştırılması

Günümüzün bilgisayarında CPU zengin bir komut dizisine sahiptir. Bu talimatlar, örneğin bir hafıza hücresini bir kayıt cihazına yerleştirmeyi, bir kayıt cihazını arttırmayı, iki kayıt cihazı eklemeyi ve daha pek çoğunu içerir. Ayrıca şartlı sıçramalar için talimatlar olması gerekir . Örneğin, Intel'in x86 ailesindeki işlemciler talimatları destekler jnz(sıfır değilse atlama), jne(atlama eşit değil), vb. Eğer bunlar eksik olacaksa, CPU Turing tamamlanmayacaktı. Koşullu atlamanın bağlı olduğu değişkenler, kayıt defterlerinde saklanır. Bu nedenle, bu talimatlar CPU'nun mimarisinde mantıksal kapılardan oluşturulan bir devre olarak bağlanır. CPU'nun iki sayıyı nasıl karşılaştırabileceği tek yol budur .

Yazılım seviyesindeki sayıların karşılaştırılması

İki sayıyı karşılaştırırsanız, bir c ++ programında söyleyin, o zaman bu makine koduna çevrilir ve bu nedenle makine düzeyinde gerçekleştirilir. Bununla birlikte, böyle bir karşılaştırma daha karmaşık olabilir. Bu, karşılaştırmanın makine koduna nasıl çevrildiğini kullandığınız veri türüne bağlıdır. Sadece bir örnek, karşılaştırmak istediğiniz sayılar 64 Bitlik kelimelerdendir ancak makinenizde yalnızca 32 bit ile çalışır. Daha sonra bu sayı bir sicile sığmaz, bu nedenle derleyici karşılaştırmayı makine kod seviyesi üzerinde bir dizi karşılaştırma dizisine böler. Aynısı, örneğin rasyonel sayıları veya karakter dizilerini veya karakterleri temsil eden daha karmaşık veri türleri / veri yapıları için de geçerlidir. Bu nedenle iki karakteri karşılaştırmanız gerektiğinde, bu yazılım tarafından (işletim sistemi, derleyici, tercüman, ...) makine koduna çevrilmelidir.

Son bir açıklama olarak, standart CPU'ların farklı sayı gösterimleriyle de çalışabileceğini belirtmek istiyorum (1 veya 2 bileşenli göstergede işaretli tamsayılar, yüzer). Ayrıca, GPU gibi bilgisayarın diğer bölümlerinde de karşılaştırmalar yapılabilir.


0

diğer cevaplar iyidir, sadece bir CS lezzet / büküm ile daha fazla düşünmek / içgörü için orada başka bir atmak. biri, herhangi bir uzunluktaki iki ikili sayıyı karşılaştırabilen, en anlamlı bitlerden çift başlayarak ve en az önemli bit (LSB) ile çalışabilen sonlu durumlu bir makine olan bir FSM oluşturabilir. başka bir cevapta verilen dijital karşılaştırıcıyı kavramsallaştırmak için de kullanılabilir, ancak FSM sonlu uzunluklu ikili sayılar gerektirmez. LSB'den sonra ikili kesirli tamsayılar üzerinde bile çalışabilir. endüktif ve özyinelici bir tada sahiptir ve basit indüksiyonla doğrulanabilir. aşağıdaki gibi çalışır:

  • ilk iki ikili basamağı bir çift olarak girin (a, b)
  • a = 1 ve b = 0 ise sol sayı daha büyüktür.
  • a = 0 ve b = 1 ise, doğru sayı daha büyüktür.
  • aksi takdirde sayılar "şimdiye kadar eşittir", bir sonraki çifte ilerler.

Başka bir deyişle, en büyük sayı, bir sıfır sırasının veya daha fazla aynı 1'lerin ilk çalıştırılmasından sonra, birincinin birincisi ve diğeri sıfır olan ilkidir. bu FSM işleminin uzunluğunun bazı sabit sayıda bitlere sabitlenmesi temelinde kapılardan veya 1 bit karşılaştırıcılardan oluşan sonlu uzunlukta bir dijital karşılaştırıcı görülebilir. (evet, tüm sonlu devreler ile FSM hesaplamalarının "uzunluğunun sabitlenmesi" arasında güçlü bir yazışma vardır.)

Bu teorik bir alıştırma gibi görünebilir, fakat aslında, yazılımdaki rasgele kesinlikli sayıları temsil eden mantık , FSM'nin adımlarını çevreleyen veya simüle ettiği görülen bir bilgisayar döngüsünde kodlanmış durumlar dışında, bu FSM'ye benzer bir şey kullanır (verimli bir uygulama MSB'nin konumunu bir indeks ile takip edebilir)


Ayrıca, bu soruyu tam sayılarla sınırlı değil olarak makul şekilde yorumlayabilmenizi / genelleştirebilmenizi sağlar . Bu soru tam sayılara atıfta bulunur, ancak başlık yalnızca sayılara işaret eder. şaşırtıcı bir şekilde hiç kimse şu ana kadar kayan nokta aritmetiğinden bahsetmedi .

birx10bbirb

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.