32 비트 시스템이 최대 2 ^ 32까지의 숫자 만 처리 할 수있는 경우 시스템이 충돌하지 않고 왜 1000000000000 (조)을 쓸 수 있습니까?


370

32 비트 컴퓨터는 최대 2 31-1의 부호있는 정수만 저장할 수 있습니다 .
이것이 IPv4 주소가 부족하여 64 비트 시대에 진입 한 이유입니다.

그러나 2 31-1 (2,147,483,647)은 1 조 (1,000,000,000,000)만큼 크지 않아 기계 충돌없이 잘 표시 될 수 있습니다.

누군가 이것이 왜 그런지 설명 할 수 있습니까?


35
질문에 결함이 있습니다. 32 비트 시스템은 2 ^ 32보다 훨씬 큰 숫자를 처리 할 수 ​​있습니다. 그들은 'long'등으로 항상 그렇게합니다. 하나의 레지스터에 최대 2 ^ 32까지 저장할 수 있지만 소프트웨어는이 문제를 무시하도록 작성되었습니다. 일부 현대 언어는 주어진 숫자의 길이에 문제가 없습니다.
JFA

23
주제, 정중하고 질문의 기술적 측면과 관련된 의견을 유지하십시오. 약 50 개의 농담 댓글이 이미 삭제되어 있어야하므로 게시물을 잠그지 않아도됩니다. 감사합니다.
닌클

6
이 질문은 약간 조잡한 방식으로 작성되었습니다. 숫자 1000000000000을 "쓰기"및 "표시"한다는 것은 무엇을 의미합니까? 당신이 질문을 썼을 때 당신은 1000000000000이라는 숫자를 썼고 당신의 웹 브라우저는 그것을 잘 표시한다고 생각합니다. 그러나 이것은 컴퓨터를 사용해 본 적이있는 사람에게는 이상한 일이 아닙니다. 질문은 자유로운 해석을 요구합니다.
HelloGoodbye

7
인간의 의식은 약 50 비트를 가지고 있다고 추정됩니다 (어딘가를 읽습니다). 따라서 문제는 " 10^9PC 충돌없이 어떻게 작성할 수 있습니까?" 가 아닙니다. 오히려 " 10^(18)뇌가 부서지지 않고 어떻게 쓸 수 있습니까?"
Hagen von Eitzen

1
32 비트 컴퓨터는 최대 2 ^ 32-1까지 부호없는 정수만 저장할 수 있습니다. 2 ^ 32-1은 2,147,483,647 ...과 같지 않습니다.
Koray Tugay

답변:


784

나는 당신에게 다른 질문을함으로써 당신의 질문에 대답합니다 :

당신은 어떻게 손가락을 6로 믿습니까?

한 손으로 가능한 최대 숫자까지 계산 한 다음 손가락이 떨어지면 초침으로 넘어갑니다. 컴퓨터는 단일 레지스터보다 큰 값을 나타내야하는 경우에도 동일한 작업을 수행하며 여러 32 비트 블록을 사용하여 데이터를 처리합니다.


16
웃긴 @codename. 그러면 손가락을 32 이상으로 계산하는 방법은 무엇입니까 (즉, 2 ^ 5가 소진되면)? ;) 이진이 다른 사람의 손으로 움직일 필요성을 늦추더라도 다른 사람의 손으로 움직이는 것과 유사합니다. 내가보고 싶은 것은 소아과 손재주로 1,024 이상으로 계산하여 바이너리로 더 세어보기 위해 발가락으로 이동하는 것입니다-최대 1,048,575! :) 잠재적으로 20 비트의 도터 보드 전원입니다. : P
J0e3gan

14
이 답변의 기술적 측면에 대한 주제와 관련하여 의견을 남겨주십시오. 60 개가 넘는 농담 댓글이이 답변에서 이미 삭제되었으므로 게시물을 잠그지 않아도됩니다.
닌클

@ codename- 쉽게 손가락 하나를 스택 포인터로 할당합니다. 손가락이 부족하면 스택에 금액을 추가하고 계산을 다시 시작하십시오.
Makach

@codename은 어디서 배웠습니까? 나는 Frederik Pohl로부터 이것을 처음 들었습니다. 예를 들어 여기 hjkeen.net/halqn/f_pohl3.htm
Zane

2
나는 이것이 관련 질문에 대한 대답이 아니라고 생각합니다. @ Bigbio2002의 답변이 올바른 것입니다. 여기서 "1000000000000"은 숫자가 아니라 "adsfjhekgnoregrebgoregnkevnregj"와 같은 텍스트입니다. 당신이 말하는 것은 사실이지만, 나는 이것이 정답이 아니라고 강하게 느낍니다. 그리고 많은 공감대를보기 위해 ...
Master Chief

398

32 비트 정수는 2 ^ 32-1보다 큰 값을 보유 할 수 없습니다. 그러나이 32 비트 정수의 값과 화면에 표시되는 방식은 완전히 다른 두 가지입니다. 인쇄 된 문자열 "1000000000000"은 메모리에서 32 비트 정수로 표시되지 않습니다.

문자 적으로 숫자 "1000000000000"을 표시하려면 13 바이트의 메모리가 필요합니다. 각 개별 바이트는 최대 255의 값을 보유 할 수 있습니다. 이들 중 어느 것도 전체 숫자 값을 보유 할 수 없지만 ASCII 문자로 개별적으로 해석 할 수는 없습니다 (예 : 문자 ' 0'는 십진수 48, 이진 값으로 00110000표시됨). 인간에게 적합한 형식으로 함께 힘을 모으십시오.


프로그래밍에 관련된 개념은 타입 캐스팅 컴퓨터가 특정 스트림 해석 방법 인 0들과 1들. 위의 예와 같이 숫자 값, 문자 또는 다른 것으로 해석 될 수 있습니다. 32 비트 정수는 1000000000000의 값을 보유 할 수 없지만 32 비트 부동 소수점 숫자는 완전히 다른 해석을 사용하여 수행 할 수 있습니다.

컴퓨터가 내부적으로 많은 수의 작업을 수행하고 처리 할 수있는 방법에 대해서는 64 비트 정수 (최대 160 억 개의 값을 수용 할 수 있음), 부동 소수점 값 및 임의로 큰 작업이 가능한 특수 라이브러리가 있습니다. 번호.


22
실제로 그것은 대부분 정확하지만 그다지 정확하지는 않습니다. 32 포인트 부동 소수점 숫자는 1000000000000을 정확하게 표현할 수 없을 것입니다. 원하는 숫자와 매우 가까운 숫자를 나타내지 만 정확하게는 아닙니다.
팀 B

6
@ TimB : decimal32 형식에 대해 들어 보셨습니까? IEEE 754-2008 표준의 일부입니다. 이 형식은이 숫자를 올바르게 표현할 수 있습니다.)
VX

15
사실은 가능합니다. 그러나 사람들이 "float"라고 할 때 사람들이 의미하는 형식은 아닙니다. 일반적으로 현재 컴퓨터의 표준 부동 소수점 프로세서에 의해 저장되고 사용되는 32 비트 부동 소수점 수를 나타냅니다.
Tim B

2
실제로 @TimB. float32로 표현할 수있는 가장 가까운 수는 999999995904
greggo

4
@TimB : 그러나 64 비트 부동 소수점 숫자는 쉽게 1000000000000정확하게 표현할 수 있습니다 . 10 ^ 12 또는 2 ^ 12 * 5 ^ 12입니다. 5 ^ 12에는 28 비트 가수가 필요합니다.
Keith Thompson

191

가장 먼저, 32 비트 컴퓨터는 단일 기계어에 최대 2³²-1의 숫자를 저장할 수 있습니다 . 기계어 는 CPU가 자연스럽게 처리 할 수있는 데이터의 양입니다 (즉, 해당 크기의 데이터에 대한 작업은 하드웨어로 구현되며 일반적으로 수행하는 속도가 가장 빠름). 32 비트 CPU는 32 비트로 구성된 단어를 사용하므로 0에서 2³²-1까지의 숫자를 한 단어에 저장할 수 있습니다 .

둘째, 1 조일조가 다른 두 가지입니다.

  • 1 조는 숫자의 추상적 개념입니다
  • 1000000000000은 텍스트입니다

1한 번 누른 다음 012 번 누르면 텍스트를 입력하는 것입니다. 1입력 1, 0입력 0. 보다? 문자를 입력하고 있습니다. 문자는 숫자가 아닙니다. 타자기는 CPU 나 메모리가 전혀 없었으며 텍스트 만 있기 때문에 그러한 "숫자"를 잘 처리하고있었습니다.

그 증거 일조은 숫자 만 텍스트되지 않습니다 : 그것은 (이진수) (십진수) 1 조, 4096 또는 281474976710656 (16 진수)을 의미 할 수 있습니다. 다른 시스템에서는 훨씬 더 많은 의미가 있습니다. 1000000000000의 의미는 숫자이며 저장하는 것은 다른 이야기입니다 (잠시 후에 다시 설명하겠습니다).

텍스트를 저장하려면 ( 문자열 이라고 함 ) 1000000000000 14 바이트가 필요합니다 (각 문자 당 1 바이트와 기본적으로 "문자열이 여기에서 끝나는"라는 의미의 종료 NULL 바이트). 그것은 4 개의 기계어입니다. 3 반 정도면 충분하지만 내가 말했듯이 기계어에 대한 작업이 가장 빠릅니다. 이제 가정하자 ASCII를 텍스트 저장을 위해 사용되기 때문에 메모리에이 같이 표시됩니다 : (에 해당하는 ASCII 코드 변환 01바이너리를 별도의 행에 각 단어)

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

한 단어에 네 문자가 들어가고 나머지는 다음 단어로 이동합니다. 나머지는 첫 번째 NULL 바이트를 포함하여 모든 것이 맞을 때까지 다음 단어로 이동합니다.

이제 숫자 저장으로 돌아갑니다. 넘쳐나는 텍스트와 똑같이 작동하지만 오른쪽에서 왼쪽으로 맞춰집니다. 복잡하게 들릴 수 있으므로 여기에 예가 있습니다. 간단하게하기 위해 다음과 같이 가정 해 봅시다.

  • 우리의 가상 컴퓨터는 이진수 대신 십진수를 사용합니다
  • 1 바이트는 숫자를 보유 할 수 있습니다 0..9
  • 한 단어는 두 바이트로 구성

빈 2 워드 메모리는 다음과 같습니다.

0 0
0 0

숫자 4를 저장합시다 :

0 4
0 0

이제 9를 추가합시다.

1 3
0 0

두 피연산자가 모두 1 바이트에 맞지만 결과는 맞지 않습니다. 그러나 우리는 다른 하나를 사용할 준비가되어 있습니다. 이제 99를 저장하자 :

9 9
0 0

다시, 우리는 숫자를 저장하기 위해 두 번째 바이트를 사용했습니다. 1을 추가합시다 :

0 0
0 0

이런 ... 그것은 정수 오버플로 라고 불리우며 많은 심각한 문제, 때로는 매우 비싼 문제의 원인 입니다 .

그러나 오버플로가 발생할 것으로 예상되면 다음을 수행 할 수 있습니다.

0 0
9 9

이제 1을 추가하십시오.

0 1
0 0

바이트 분리 공백과 줄 바꿈을 제거하면 더 명확 해집니다.

0099    | +1
0100

오버플로가 발생할 수 있으며 추가 메모리가 필요할 수 있습니다. 이 방법으로 숫자를 처리하는 것은 단일 단어에 맞는 숫자만큼 빠르지 않으며 소프트웨어로 구현해야합니다. 32 비트 CPU에 2 개의 32 비트 단어 번호 지원을 추가하면 효과적으로 64 비트 CPU가됩니다 (현재 64 비트 숫자로 작동 할 수 있습니다).

위에서 설명한 모든 것은 8 비트 바이트 및 4 바이트 단어가있는 이진 메모리에도 적용되며 거의 같은 방식으로 작동합니다.

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

그러나 이러한 숫자를 십진법으로 변환하는 것은 까다 롭습니다. (그러나 16 진수와 잘 작동합니다 )


21
당신의 대답은 다소 혼란스러워 읽습니다. OP는 텍스트가 아닌 숫자에 대해 분명히 이야기하고 large as the number 1 trillion (1000000000000)있습니다. 또한, 당신은 거의 임의의 정밀 산술 에 대해 이야기하고 있지만, 당신이 말하는 것에 대한 용어는 결코 언급하지 않습니다 ....
MirroredFate

12
"1 조"도 문자열입니다
Elzo Valugi

3
@ElzoValugi입니다. 숫자를 나타내는 문자열과 달리 추상 숫자의 개념을 제시하는 방법을 찾아야했습니다. 나는 "1 조"가 더 좋고 덜 모호한 방법이라고 믿는다 (답변의 증거를 보라).
gronostaj

25
@MirroredFate 나는 '숫자에 대해 분명히 이야기하고 있습니다'에 동의하지 않습니다. 영업 이익은 명확하게하는, '잘 표시'라고 한다 ... 나에게 텍스트 '1000000000000'에 대해 이야기

4
@yannbane 'A'는 숫자가 아닌 문자입니다. '?' 숫자가 아닌 문자입니다. '1'은 문자이며 숫자도 아닙니다. 문자는 기호 일뿐입니다. 숫자 나 숫자를 나타낼 수 있지만 숫자는 아닙니다. '1'은 1, 10, 백, 천 등을 나타낼 수 있으며 숫자 또는 그 일부가 될 수있는 숫자를 나타내는 기호 일뿐입니다. '10'(문자열)은 2 개 또는 8 개 또는 10 개 또는 16 개 등을 의미 할 수 있지만 10 개의 사과가 있다고 말하면 숫자 10을 사용하고 있으며 모든 사람이 자신의 의미를 알고 있습니다. 문자와 숫자에는 큰 차이가 있습니다.
gronostaj

40

당신은 또한 컴퓨터 충돌없이 "이 진술은 거짓" 이라고 쓸 수 있습니다. 해석됩니다.

편집 : 이제 숫자 가 메모리에 저장 될 수있는 다양한 방법에 대한 유용한 정보 가 적습니다 . 현대 프로그래머가 코드를 실행하기 위해 기계 코드로 변환하기 전에 코드를 작성한다는 관점에서 이것들을 더 높은 추상화 로 설명하겠습니다 .

컴퓨터의 데이터는 특정 유형 으로 제한되어야하며 , 이러한 유형의 컴퓨터 정의는이 데이터에 대해 수행 할 수있는 작업과 방법 (예 : 숫자 비교, 텍스트 연결 또는 XOR 부울)을 설명합니다. 숫자에 텍스트를 곱할 수없는 것처럼 숫자에 텍스트를 추가 할 수 없으므로 이러한 값 중 일부를 유형간에 변환 할 수 있습니다.

unsigned integers 부터 시작해 봅시다 . 이 값 유형에서 모든 비트는 숫자에 대한 정보를 저장하는 데 사용됩니다. 당신은 예이며 32 비트 부호없는 정수 의 값 0으로는 2^32-1저장 될 수있다. 그리고 사용되는 플랫폼의 언어 나 아키텍처에 따라 16 비트 정수 또는 256 비트 정수를 가질 수 있습니다.

부정적인 생각을 가지려면 어떻게해야합니까? 직관적으로 부호있는 정수 는 게임의 이름입니다. 협약에서 모든 값을 할당하는 것입니다 -2^(n-1)2^(n-1)-1우리가이 쓸 수있는 방법을 처리해야하는 혼란을 피하기 이런 식으로 - +0-0. 따라서 32 비트 부호있는 정수는 -2147483648~ 에서 값을 보유합니다 2147483647. 깔끔하지 않습니까?

자, 우리는 소수 성분이없는 숫자 인 정수를 다루었습니다. 비 정수 부분이 눈에 띌 만 사이 어딘가 될 수 있습니다 이러한 까다 롭습니다 표현 0하고 1그래서 모든 여분의 비트가 그것의 정밀도를 증가시킬 것입니다 설명하는 데 사용 : 1/2, 1/4, 1/8 ... 문제는이다, 당신 0.1분모에 2의 거듭 제곱 만 가질 수있는 분수의 합으로 간단한 소수 를 정확하게 표현할 수 없습니다 ! 숫자를 정수로 저장하는 것이 훨씬 쉽지는 않지만 대신 기수 (십진수) 점을 넣는 데 동의합니까? 이것을 고정 점 번호 라고 하며, 우리는이를 저장 1234100하지만 1234.100대신 협약에 동의 합니다.

계산에 사용되는 비교적 일반적인 유형은 floating point입니다. 그것이 작동하는 방식은 정말 깔끔합니다 .1 비트를 사용하여 부호 값을 저장하고 일부는 지수와 유의성을 저장합니다. 이러한 할당을 정의하는 표준이 있지만 32 비트 플로트 의 경우 저장할 수있는 최대 수는 압도적입니다.

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

그러나 이것은 정밀도가 떨어집니다. 브라우저에서 사용할 수있는 JavaScript는 64 비트 부동 소수점을 사용하며 여전히 제대로 작동하지 않습니다. 이것을 주소 표시 줄에 복사하고 Enter를 누르십시오. 스포일러 경고 : 결과가 없습니다 될 것이다 0.3.

javascript:alert(0.1+0.2);

BigInteger이론적으로 상한 또는 하한이없고 "배치"로 계산해야하는 Microsoft .NET 4.5와 같은 다른 대체 유형 이 있습니다. 그러나 아마도 가장 흥미로운 기술은 Wolfram Mathematica 엔진과 같이 수학 을 이해 하는 기술이며 무한대 와 같은 추상적 인 값으로 정확하게 작동 할 수 있습니다 .


8
현실 에서 그렇게 할 수 있습니다 . 스타 트렉 세계에서 그렇게 해보세요. 모든 스파크와 연기 때문에 그냥 뒤로 물러서십시오.
Michael Petrotta

고정 소수점 작동 방식이 아닙니다. 실제로 소수점을 생성하기 위해 숫자를 스케일링하고 바이어스하는 시스템입니다. 귀하의 예에서 스케일은 1/1000이지만 다음과 같이 고정 소수점 숫자 (특히 컴퓨터 그래픽)도 있습니다 : 0 = 0.0, 255 = 1.0-스케일은 1/255입니다.
Andon M. Coleman

31

열쇠는 컴퓨터가 숫자를 어떻게 인코딩 하는지 이해하는 것 입니다.

사실, 컴퓨터가 단일 단어 (32 비트 시스템에서 4 바이트)를 사용하여 숫자의 간단한 이진 표현을 사용하여 숫자를 저장해야하는 경우 32 비트 컴퓨터는 2 ^ 32까지만 숫자를 저장할 수 있습니다. 그러나 숫자로 달성하고자하는 것에 따라 숫자를 인코딩하는 다른 방법이 많이 있습니다.

한 가지 예는 컴퓨터가 부동 소수점 숫자를 저장하는 방법입니다. 컴퓨터는 다양한 방법으로 컴퓨터를 인코딩 할 수 있습니다. 표준 IEEE 754 는 2 ^ 32보다 큰 숫자를 인코딩하기위한 규칙을 정의합니다. 결정적으로 컴퓨터는 32 비트를 숫자의 일부 숫자를 나타내는 다른 부분과 숫자의 크기 를 나타내는 다른 비트 (예 : 지수 10 ^ x) 로 나누어이를 구현할 수 있습니다 . 이것은 훨씬 더 넓은 범위를 허용합니다크기 측면에서 숫자의 숫자이지만 정밀도를 손상시킵니다 (다양한 목적에는 괜찮습니다). 물론 컴퓨터는이 인코딩을 위해 하나 이상의 단어를 사용하여 사용 가능한 인코딩 된 숫자의 크기의 정밀도를 높일 수 있습니다. IEEE 표준의 간단한 10 진수 32 버전은 약 7 자리의 정밀도로 최대 10 ^ 96까지의 숫자를 허용합니다.

그러나 추가 정밀도가 필요한 경우 다른 옵션이 많이 있습니다. 분명히 인코딩에 더 많은 단어를 사용할 수 있습니다 (인코딩 형식으로 변환하거나 변환하는 데 성능 저하가 있음에도 불구하고). 한 가지 방법으로 탐색하려는 경우 계산에 수백 자릿수의 정밀도를 허용하는 인코딩 체계를 사용하는 Excel 용 훌륭한 오픈 소스 추가 기능이 있습니다. 추가 기능을 Xnumbers라고하며 여기에서 사용할 수 있습니다 . 이 코드는 Visual Basic으로되어 있으며 가장 빠르지는 않지만 이해하고 수정하기 쉽다는 장점이 있습니다. 컴퓨터가 더 긴 숫자를 인코딩하는 방법을 배우는 좋은 방법입니다. 프로그래밍 도구를 설치하지 않고도 Excel에서 결과를 확인할 수 있습니다.


24

모두 당신의 질문에 있습니다.

종이에 원하는 숫자를 수 있습니다 . 흰 종이에 1 조 개의 점을 쓰십시오. 느리고 비효율적입니다. 그래서 우리는 그 큰 숫자를 나타내는 10 자리 시스템을 가지고 있습니다. "million", "trillion"등과 같은 큰 숫자의 이름도 있으므로 one one one one one one one one one one one...큰소리로 말하지 마십시오 .

32 비트 프로세서는 정확히 32 개의 이진수 인 메모리 블록에서 가장 빠르고 효율적으로 작동하도록 설계되었습니다. 그러나 사람들은 일반적으로 10 자리 숫자 시스템을 사용하고 전자 컴퓨터는 2 자리 시스템 ( binary )을 사용합니다. 숫자 32와 64는 단지 2의 거듭 제곱이됩니다. 백만과 1 조는 10의 거듭 제곱입니다. 예를 들어, 다수의 65536보다이 숫자로 조작하는 것이 더 쉽습니다.

우리는 큰 숫자를 종이에 쓸 때 숫자로 나눕니다. 컴퓨터는 숫자를 더 큰 숫자로 나눕니다. 우리는 마음에 드는 숫자를 적을 수 있으며, 그렇게 설계하면 컴퓨터도 마찬가지입니다.


15

32 비트 및 64 비트는 메모리 주소를 나타냅니다. 컴퓨터 메모리는 우체국 상자와 같으며 각각 주소가 다릅니다. CPU (Central Processing Unit)는이 주소를 사용하여 RAM (Random Access Memory)의 메모리 위치를 지정합니다. CPU가 16 비트 주소 만 처리 할 수있는 경우 32MB의 RAM 만 사용할 수있었습니다 (당시 큰 것으로 보임). 32 비트로 4 + 기가 바이트로갔습니다 (당시 큰 것처럼 보였습니다). 이제 64 비트 주소를 갖게되었으므로 RAM은 테라 바이트 (대용량)로 나타납니다.
그러나 프로그램은 숫자 및 텍스트 저장과 같은 프로그램에 대해 여러 주소의 메모리를 할당 할 수 있습니다. 즉, 프로그램마다 다르며 각 주소의 크기와 관련이 없습니다. 따라서 프로그램은 CPU에 말할 수 있습니다. 10 개의 주소 블록을 사용한 다음 매우 큰 수 또는 10 자의 문자열 등을 저장합니다.
참고 : 메모리 주소는 "포인터"로 가리 키므로 32 비트 및 64 비트 값은 메모리에 액세스하는 데 사용되는 포인터의 크기를 의미합니다.


2
세부 사항을 제외하고 좋은 대답-16 비트의 주소 공간은 32MB가 아닌 64KB를 제공했으며 286과 같은 컴퓨터에는 24 비트 주소 (16MB)가 있습니다. 또한 64 비트 주소를 사용하면 테라 바이트 (16 엑사 바이트와 유사)를 훨씬 넘어서게됩니다. 테라 바이트는 현재 크기의 마더 보드 / CPU가 부과하는 한계에 가깝습니다.
Phil

4
32 비트는 메모리 주소가 아닌 기계어 크기를 나타냅니다. Phil이 언급했듯이 286은 16 비트 CPU이지만 메모리 세분화를 통한 주소 지정에는 24 비트를 사용했습니다. x86 CPU는 32 비트이지만 36 비트 주소 지정을 사용합니다. PAE를 참조하십시오 .
gronostaj

@gronostaj well x86은 386에서 Pentium까지 32 비트 주소를 가지고 있습니다.
Ruslan

32 비트는 32 비트 산술이 아니라 32 비트 메모리 주소 지정을 나타냅니다.
user1207217

@ user1207217 : ?? 예를 들어 Z80 또는 8080과 같은 추론에 따르면 16 비트 프로세서 (16 비트 메모리 주소 지정 및 메모리 버스 때문에)입니까?
pabouk

13

숫자 표시는 정수가 아닌 개별 문자를 사용하여 수행되기 때문입니다. 숫자의 각 숫자는 별도의 문자 리터럴로 표시되며 정수 값은 사용중인 인코딩에 의해 정의됩니다. 예를 들어 'a'ascii value 로 표시 97되고 '1'로 표시됩니다 49. 여기서 아스키 테이블을 확인 하십시오 .
'a'와 '1'을 모두 표시하는 것은 동일합니다. 정수가 아닌 문자 리터럴입니다. 각 문자 리터럴은 8 비트 또는 1 바이트 크기로 값을 저장하는 32 비트 플랫폼에서 최대 값 255를 가질 수 있습니다 (플랫폼에 따라 다르지만 8 비트가 가장 일반적인 문자 크기 임). 표시됩니다. 표시 할 수있는 개별 문자 수는 RAM에 따라 다릅니다. RAM이 1 바이트 인 경우 하나의 문자 만 표시 할 수 있고, 1GB의 RAM이 있으면 1024 * 1024 * 1024자를 잘 표시 할 수 있습니다 (연산하기에는 너무 게으름).

그러나이 제한은 계산에 적용되지만 IPV4 표준에 관심이있는 것 같습니다. 컴퓨터와는 전혀 관련이 없지만bit-size표준에 영향을 미칩니다. IPV4 표준을 만들 때 IP 값을 32 비트 정수로 저장했습니다. 이제 크기를 정하면 표준이되었습니다. 인터넷에 관해 우리가 아는 모든 것은 그것에 의존하고 있었고, 할당 할 IP 주소가 부족했습니다. 따라서 IP 표준이 64 비트로 수정되면 라우터 (정확하다고 가정) 및 기타 네트워킹 장치를 포함하여 모든 것이 작동을 멈 춥니 다. 따라서 32 비트 정수를 128 비트 1로 교체 한 새로운 표준을 만들어야합니다. 그리고 나머지 표준을 조정했습니다. 하드웨어 제조업체는이 새로운 표준을 지원한다고 선언하면 바이러스에 감염 될 수 있습니다. 그렇게 간단하지는 않지만 여기에 요점이 있다고 생각합니다.

면책 조항 : 여기에 언급 된 대부분의 주장은 내 가정에 충실합니다. 더 간단하게하기 위해 여기서 중요한 요점을 놓쳤을 수도 있습니다. 나는 숫자가 좋지 않기 때문에 일부 숫자를 놓쳤을 것입니다. 그러나 여기서 요점은 PC와 충돌하지 않는 이유에 대한 OP의 대답에 대답하는 것입니다.


2
나는 downvoted하지 않았습니다, 그러나 당신의 대답에 많은 문제가 있습니다. 10x1이 아닌 ASCII에서 0x31입니다. 1 GB = 1024 ^ 3 B. 32 비트 CPU가 도입되기 전에 발명 된 IPv4 뭉치 때문에 주소가 32 비트 정수로 저장된다는 것은 OP의 질문과 충돌합니다. 마지막으로 IPv6은 64 비트가 아닌 128 비트 주소를 사용합니다.
gronostaj

13

프로세서에는 "단어"가 있습니다. 다른 단어가 있습니다. 사람들이 "32 비트 프로세서"라고 말하면 대부분 "메모리 버스 너비"를 의미합니다. 이 단어는 서로 다른 "필드"로 구성되며, 전송 (24 비트) 및 제어 (다른 비트)에 해당하는 컴퓨터의 하위 시스템을 나타냅니다. 나는 정확한 숫자에 대해 틀릴 수 있습니다. 매뉴얼을 통해 그것에 대해 확신하십시오.

완전히 다른 측면은 계산입니다. SSE 및 MMX 명령어 세트는 긴 정수를 저장할 수 있습니다. 생산성 손실이없는 최대 길이는 현재 SSE 버전에 따라 다르지만 항상 64 비트의 배수입니다.

현재 Opteron 프로세서는 256 비트의 넓은 숫자를 처리 할 수 ​​있습니다 (정수는 확실하지 않지만 float는 확실합니다).

요약 : (1) 버스 폭이 계산 폭에 직접 연결되지 않음, (2) 다른 단어 (메모리 워드, 레지스터 워드, 버스 워드 등)가 서로 연결되지 않은 경우 24. 많은 프로세서가 6 비트 워드 (단, 이력)를 사용했습니다.


원래의 펜티엄 프로세서는 32 비트 프로세서 였지만 높은 메모리 대역폭을위한 64 비트 데이터 버스를 가지고있었습니다. 8088은 8 비트 데이터 버스가있는 16 비트 프로세서입니다.
doug65536

10

컴퓨팅 장치의 목적은 일반적으로 데이터를 수용, 처리, 저장 및 방출하는 것이다. 기본 하드웨어는이 네 가지 기능을 수행하는 데 도움이되는 기계 일뿐입니다. 소프트웨어가없는 사람은 할 수 없습니다.

소프트웨어는 데이터를 수락하는 방법, 처리 방법, 저장 방법 및 다른 사람에게 데이터를 제공하는 방법을 컴퓨터에 알려주는 코드입니다.

기본 하드웨어에는 항상 제한이 있습니다. 32 비트 시스템의 경우 데이터를 처리하는 대부분의 레지스터는 너비가 32 비트입니다. 그렇다고 기계가 2 ^ 32 이상의 숫자를 처리 할 수 ​​없다는 것을 의미하지는 않습니다. 더 큰 숫자를 처리하려면 기계를 받아들이고 처리하고 저장하는 데 두 번 이상의주기가 필요할 수 있습니다. 또는 방출하십시오.

소프트웨어는 기계에 숫자를 처리하는 방법을 알려줍니다. 소프트웨어가 많은 수를 처리하도록 설계된 경우 더 큰 수를 처리하는 방법을 알려주는 일련의 명령을 CPU에 보냅니다. 예를 들어, 숫자는 두 개의 32 비트 레지스터로 표시 될 수 있습니다. 1,234를 번호에 추가하려면 소프트웨어가 CPU에 먼저 1,234를 하위 레지스터에 추가하도록 지시 한 다음 오버플로 비트를 확인하여 추가로 인해 하위 레지스터에 비해 너무 큰 숫자가 발생했는지 확인하십시오. 만약 그렇다면, 상위 레지스터에 1을 더합니다.

초등학교 학생들에게 캐리를 추가하는 것과 같은 방식으로 CPU는 단일 레지스터에 수용 할 수있는 것보다 더 큰 수를 처리하도록 지시 할 수 있습니다. 이것은 실제 크기의 숫자에 대해 가장 일반적인 수학 연산에 해당됩니다.


10

차이점은 컴퓨터에 데이터를 저장하는 방법에 있습니다.

이론적 인 8 비트 시스템의 경우 단일 프로세서 레지스터 또는 메모리 주소에 2 ^ 8 값만 저장할 수 있습니다. (이것은 사용 된 프로세서, 메모리 아키텍처 등에 따라 "기계"에서 "기계"까지 다양하다는 점을 명심하십시오. 그러나 지금은 가상의 "스테레오 타입"기계를 고집합시다.)

이론적 인 16 비트 시스템의 경우 레지스터 / 메모리 위치의 최대 값은 32 비트 시스템, 2 ^ 32 등의 경우 2 ^ 16입니다.

수년에 걸쳐 프로그래머들은 단일 프로세서 레지스터 또는 메모리 주소에 저장 될 수있는 것보다 더 많은 수를 저장하고 처리하기 위해 모든 종류의 치커리를 고안했습니다. 많은 방법이 존재하지만 모두 "기본"레지스터 / 메모리 위치 너비보다 큰 값을 저장하기 위해 둘 이상의 레지스터 / 메모리 주소를 사용합니다.

이러한 모든 방법은 머신이 기본 용량보다 큰 값을 저장 / 처리 할 수 ​​있다는 점에서 유리합니다. 단점은 거의 모든 접근 방식에 여러 기계 명령 / 읽기 등이 필요하다는 것입니다. 이 숫자를 처리합니다. 가끔씩 많은 경우 문제가되지 않습니다. 를 다룰 때 많은 (특히 대용량 메모리 주소) 많은 수의 관련된 오버 헤드가 일을 속도가 느려집니다.

따라서, 많은 수의 "네이티브"를 처리하기 위해 레지스터, 메모리 위치 및 메모리 어드레스 하드웨어를 "더 넓게"넓게 만들고자하는 이러한 일반적인 요구는 그러한 숫자가 최소의 조작으로 처리 될 수있다.

숫자 크기는 무한하므로 프로세서 레지스터 / 메모리 크기 / 어드레싱은 항상 기본 숫자 크기와 더 큰 너비와 더 큰 너비를 구현하는 데 드는 비용의 균형입니다.


8

32 비트 컴퓨터는 단일 기계어에 최대 2 ^ 32까지의 숫자 만 저장할 수 있지만 더 큰 데이터 엔터티를 처리 할 수는 없습니다.

32 비트 컴퓨터의 의미는 일반적으로 데이터 버스 및 주소 버스의 너비가 32 비트이므로 컴퓨터가 한 번에 4GB의 메모리 주소 공간을 처리하고 한 번에 4 바이트의 데이터를 데이터 버스를 통해 보낼 수 있음을 의미합니다. .

그러나 컴퓨터가 더 많은 데이터를 처리하는 것을 제한하지는 않으며 데이터 버스를 통해 데이터를 전송할 때 데이터를 4 바이트 청크로 나눠야합니다.

일반 인텔 32 비트 프로세서는 내부적으로 128 비트 숫자를 처리 할 수 ​​있으므로 아무런 문제없이 100000000000000000000000000000000000000과 같은 숫자를 처리 할 수 ​​있습니다.

컴퓨터에서보다 훨씬 더 많은 수를 처리 할 수 ​​있지만 계산은 소프트웨어로 수행해야하며 CPU에는 128 비트보다 큰 수를 처리하기위한 명령이 없습니다. 부동 소수점 숫자의 형태로 훨씬 더 큰 숫자를 처리 할 수 ​​있지만 15 자리의 정밀도 만 있습니다.


6

이것은 많은 다른 답변에 메모를 추가하는 것입니다.이 질문에서 놓친 중요한 사실이기 때문입니다.

"32 비트"는 메모리 주소 너비를 나타냅니다. 레지스터 크기와 관련이 없습니다. 많은 32 비트 CPU에는 64 비트 또는 128 비트 레지스터가있을 수 있습니다. 특히 x86 제품군을 참조하면, 최신 소비자 CPU (모두 64 비트)는 특수 목적으로 최대 256 비트 레지스터를 갖습니다.

레지스터 너비와 주소 너비의 이러한 차이는 고대부터 4 비트 레지스터와 8 비트 주소가 있었을 때부터 존재했으며 그 반대도 마찬가지입니다.

다른 답변에서 설명한 것처럼 레지스터 크기에 관계없이 많은 수를 저장해도 문제가 없음을 쉽게 알 수 있습니다.

레지스터는, 어떤 크기의 그들은, 추가도 할 수로 발생할 수 있습니다 이유 계산 , 더 큰 숫자가 너무 큽니다 계산이 그냥 작은 조금 더 복잡 (레지스터에 맞지 않는 여러 개의 작은 것들로 분해 될 수 있다는 것입니다 실제로).


사실이 아닙니다. 64 비트가 의미하는 것은 일치하지 않지만 레지스터 너비가 64 비트 인 시스템을 종종 64 비트라고합니다. Wikipedia는 "64 비트 컴퓨터 아키텍처는 일반적으로 64 비트 폭의 정수 및 주소 지정 레지스터를 가지고 있습니다"라고 말합니다. 그렇습니다. 최신 x86 (또는 AMD-64) 제품 라인에는 거대한 특수 레지스터가 있지만 64 비트 주 레지스터가 있으며 48-52 비트의 메모리에 액세스 할 수 있습니다. 구형 x86 시스템은 32 비트 기본 레지스터와 24-36 비트 메모리에 액세스하고 8086은 16 비트 칩이라고하며 16 비트 폭 레지스터를 가지며 20 비트 메모리에 액세스했습니다.
prosfilaes

@prosfilaes 그것은 많은 귀중한 정보입니다. 나는 그것들을 언급하고있었습니다. 이 답변을 자유롭게 편집하십시오.
mafu 2019 년

6

이미 주어진 답변은 실제로는 좋지만 다른 측면에서 문제를 해결하는 경향이 있으므로 불완전한 그림을 제시합니다. 그들은 또한 내 의견으로는 약간 지나치게 기술적입니다.

따라서 힌트를 얻었지만 다른 답변으로 명시 적으로 표현하지 않은 것을 명확히하기 위해, 나는 문제의 요점이라고 생각합니다.

귀하의 질문에 여러 개념을 혼합하고 있으며 그중 하나 ( "32 비트")는 실제로 다양한 다른 것을 나타낼 수 있습니다 (다른 답변은 다른 해석을 가정했습니다). 이러한 개념은 모두 다양한 컴퓨팅 컨텍스트에서 사용되거나 사용 가능한 비트 수 (1 및 0) 와 관련 이 있지만 (아래의 예제에서 잘 알 수 있음) 개념은 관련이 없습니다 .

명시 적으로 :

  • "IPv4 / 6"은 인터넷에서 정보가 패키지화되고 해석되는 방법을 정의하는 일련의 규칙 인 인터넷 프로토콜을 나타냅니다 . IPv4와 IPv6의 주요 (또는 적어도 가장 잘 알려진) 구별은 IPv6에서 주소 공간 (즉, 네트워크의 다른 위치를 구별하는 데 사용할 수있는 주소 세트)이 더 크다는 것입니다. 이는 네트워크를 통해 전송 된 각 데이터 패킷의 몇 비트 가 패킷의 발신자와 의도 된 수신자를 식별하기 위해 할당 (즉, 목적을 위해 따로 설정)하는 것과 관련이 있습니다.
    • 비계산 비유 : 각 패킷은 달팽이 메일을 통해 전송되는 문자와 같으며 주소 공간은 봉투에 주소와 반송 주소를 쓸 때 사용할 수있는 문자의 양과 같습니다.
    • 나는 지금까지 다른 답변에서 언급되지 않았습니다.
  • 컴퓨터 메모리 "단어"(32 비트 및 64 비트)는 일반적으로 컴퓨터에서 사용하는 가장 작은 데이터 또는 "생각"으로 생각할 수 있습니다. 이러한 비트는 서로 결합하여 다른 비트의 데이터를 구성합니다. 텍스트 덩어리 또는 더 큰 정수와 같은
  • 32 비트 포인터 는 단어 일 수도 있고 아닐 수도 있지만 그럼에도 불구하고 원자 적으로 (즉, 더 작은 구성 요소로 나눌 수없는 개별 단위로) 취급됩니다. 포인터는 컴퓨터가 임의의 데이터 덩어리의 메모리에 위치를 기록 할 수있는 가장 낮은 수준의 방법입니다. 컴퓨터 (또는 실제로 운영 체제)에서 사용하는 포인터 크기는 포인터가 "지정"할 수있는 메모리 위치가 많기 때문에 단일 포인터로 액세스 할 수있는 메모리 범위를 제한합니다. 포인터 자체에 가능한 값이 있기 때문입니다. 이는 IPv4가 가능한 인터넷 주소의 범위를 제한하는 방식과 유사하지만 그렇지 않습니다.예를 들어 특정 웹 페이지에 존재할 수있는 데이터의 양을 제한하십시오. 그러나 포인터 크기는 포인터가 가리킬 수있는 데이터 자체의 크기를 제한 하지 않습니다 . (데이터 크기가 포인터 범위를 초과하는 방식의 예는 Linux의 inode 포인터 구조를 확인하십시오 . 포인터는 일반적으로 하드 드라이브 공간이 아닌 임의 액세스 메모리.)
    • 비계산 비유 : 흠 ... 이것은 조금 까다 롭습니다. 아마도 라이브러리 자료를 색인화하기위한 듀이 십진법은 약간 비슷합니까? 또는 모든 인덱싱 시스템.
    • SiteNook의 답변을 참조하십시오 .
    • 위의 포인터에 대한 나의 설명은 미묘한 세부 사항을 생략하고 완전히 정확하지는 않습니다. 그러나 프로그래머가 포인터로 직접 작업하는 프로그래밍 언어에서 필자가 그린 멘탈 모드는 일반적으로 실용적인 목적으로 충분합니다.
  • 컴퓨터가 "표시 할 수"이라고 숫자 컴퓨터의 하드웨어 나 운영체제에 의해 제한 (실제 목적)되지 않습니다; 그들은 다른 텍스트처럼 취급됩니다.

이것은 "32 비트"라는 문구에 대한 포괄적 인 해석 목록이 아닙니다.

추가 학점 : 컴퓨터 메모리의 숫자와 원시 덩어리 사이의 철학적 차이를 실제로 보려면 튜링 머신 에 대해 조금 읽어보십시오 .


IPv4에 대한 언급은 IPv4 주소의 수가 부호있는 32 비트 정수의 길이로 효과적으로 제한되는 반면 IPv6은 128 비트를 사용하므로 더 많은 수의 주소를 가질 수 있다고 지적했습니다.
Clonkex

@Clonkex 아마도 그 질문은 확실하지 않습니다.
Kyle Strand

5

예를 들어 계산기에 1000000000000을 쓰면 컴퓨터는 소수점을 가진 실수 형 숫자 로 계산합니다 . 언급 한 32 비트에 대한 제한은 소수점없이 더 많은 정수 유형 숫자에 닿습니다 . 데이터 유형에 따라 비트 / 바이트로 들어가는 방법이 다릅니다.

정수 유형 번호 :이 표는 요점을 파악하는 데 도움이 될 수 있습니다 ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). 이것은 C ++의 한계에 부딪칩니다. 예를 들어 Int64 유형 번호 는 -9223372036854775808에서 9223372036854775807로 제한됩니다.

실수 타입 숫자 : 실수 타입 숫자는 부동 소수점지수를 가진 값을 포함하며 훨씬 더 큰 숫자를 입력 할 수 있지만 정확도 / 정밀도는 제한적입니다. ( http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) C ++ 그래서 아마도 입력하거나 결과 번호로서 가질 수있는 최대 지수 (308)을 가지고 예를 LDBL (큰 배)의 경우 9.999 x 10^308에는 의미 이론적으로 308 (+1) 자리수를 9가지지 만 가장 중요한 자리수는 15 자리 만 사용되며 나머지는 손실되며 정밀도가 떨어집니다.

또한 다른 프로그래밍 언어가 있으며 숫자 제한의 구현이 다를 수 있습니다. 따라서 특수 응용 프로그램이 C ++보다 훨씬 더 큰 (또는 더 정확한 / 정확한) 숫자를 처리 할 수 ​​있다고 상상할 수 있습니다.


이 "답변"은 올바르지 않습니다. 계산기는 잘림 오류를 피하기 위해 BCD 숫자 표시를 사용합니다. IE 0.1 10 진수는 유한 길이 이진수로 정확하게 표현 될 수 없습니다.
톱밥

5

일반적인 Linux 시스템의 많은 프로그램이 많은 수의 처리 및 출력을 처리하는 실제 사례를 원할 경우 :

libgmp- 는 GNU 여러 정밀 산술 라이브러리는 리눅스 시스템에서이 목적을 위해 가장 널리 사용되는 라이브러리입니다. 2 ^ 80에 1000을 곱한 간단한 예 :

#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);

따라서 기본적으로 일반 +-* / 연산자를 사용하는 것과 동일합니다. 라이브러리를 사용하여 숫자를 나누고 여러 기계 단어 크기 (예 : 32 비트) 숫자로 내부적으로 저장합니다. 텍스트 입력을 정수 유형으로 변환하는 것을 처리하기위한 scanf () 유형 함수도 있습니다.

의 구조는 mpz_t스캇 체임벌린의 두 손으로 6을 세는 예와 정확히 같습니다. 기본적으로 기계어 크기의 mp_limb_t유형 배열이며 , 숫자가 기계어에 맞지 않을 때 GMP는 여러 개 mp_limb_t를 사용 하여 숫자의 상위 / 하위 부분을 저장합니다.


5

당신의 마음에는 10 개의 다른 숫자 만 알고 있습니다. 0에서 9. 뇌 내부에서 이것은 확실히 컴퓨터와 다르게 인코딩됩니다.

컴퓨터는 비트를 사용하여 숫자를 인코딩하지만 중요하지는 않습니다. 그것은 엔지니어가 물건을 인코딩하기로 선택한 방식이지만 무시해야합니다. 32 비트 컴퓨터는 40 억 개 이상의 다른 값을 나타내는 고유 한 표현을 가지고 있지만 인간은 10 개의 다른 값을 나타내는 고유 한 표현을 가지고 있다고 생각할 수 있습니다.

더 큰 숫자를 이해해야 할 때마다 시스템을 사용합니다. 가장 왼쪽 숫자가 가장 중요합니다. 다음보다 10 배 더 중요합니다.

40 억 개의 서로 다른 값을 구별 할 수있는 컴퓨터는 마찬가지로 가장 왼쪽에있는 값을 일련의 값에서 그 값의 다음 값보다 40 억 배 중요하게 만들어야합니다. 실제로 컴퓨터는 전혀 신경 쓰지 않습니다. 숫자에 "중요도"를 할당하지 않습니다. 프로그래머는이를 처리하기 위해 특수 코드를 작성해야합니다.

사람의 마음에 9가 고유 기호의 수보다 커질 때마다 왼쪽의 숫자에 1을 더합니다.

3+3=6

이 경우, 숫자는 여전히 단일 "슬롯"에 맞습니다.

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

따라서 인간은 항상 고유 한 기호가 충분하지 않은 문제를 처리합니다. 컴퓨터가이를 처리 할 시스템을 가지고 있지 않다면, 단순히 0을 쓰면 추가 번호가 있다는 것을 잊어 버릴 것입니다. 운 좋게도 컴퓨터에는이 경우 발생하는 "오버플로 플래그"가 있습니다.

987+321 is more difficult.

학교에서 방법을 배웠을 수도 있습니다. 알고리즘. 알고리즘은 매우 간단합니다. 가장 왼쪽에있는 두 개의 기호를 추가하여 시작하십시오.

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

그런 다음 다음 슬롯으로 이동하여 동일한 추가를 수행하십시오.

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

오버플로가 발생 했으므로 다음 숫자에 1을 더해야 함을 의미합니다.

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

더 이상 추가 할 숫자가 없으므로 오버플로 플래그가 발생했기 때문에 간단히 슬롯과 삽입 자 1을 만듭니다.

1308

컴퓨터는 인간과 같은 10 개가 아닌 2 ^ 32 또는 더 나은 2 ^ 64 개의 다른 기호가 있다는 점을 제외하고는 정확히 같은 방식으로 작동합니다.

하드웨어 수준에서 컴퓨터는 정확히 같은 방법으로 단일 비트에서 작동합니다. 운 좋게도, 그것은 프로그래머들을 위해 추상화되어 있습니다. 비트는 전력선으로 표현하기 쉽기 때문에 두 자리입니다. 표시등이 켜져 있거나 꺼져 있습니다.

마지막으로 컴퓨터는 임의의 숫자를 간단한 문자 시퀀스로 표시 할 수 있습니다. 그것이 컴퓨터가 가장 잘하는 것입니다. 일련의 문자와 내부 표현을 변환하는 알고리즘은 매우 복잡합니다.


마음 나는 36 알지만, 일반적으로 만 16 개를 사용합니다.
Kyle Strand

'컴퓨터는 비트를 사용하여 숫자를 인코딩하지만 중요하지 않습니다.' 약 32 비트 단어를 묻는 사용자와 2 ^ 32-1보다 큰 숫자를 저장하는 데 사용되는 방법이 매우 중요합니다.
HörmannHH

뇌의 기억에 숫자를 어떻게 인코딩 하는가는 중요하지 않습니다. 한정된 수의 표현이 있습니다. 대부분 10 개의 다른 기호를 배웠습니다. 당신의 뇌 안에서 이것은 아마도 수천 개의 뉴런과 시냅스의 형태로 표현 될 것입니다. 컴퓨터에서는 전기 형태로 표시되거나 전력선에 전기가 공급되지 않습니다. 프로그래밍 관점에서 또는 수학을 배울 때 특정 CPU 세트에 대해 직접 프로그래밍하는 드문 경우를 제외하고는 전혀 중요하지 않습니다. 그는 개별 비트가 아닌 32 비트 대 64 비트를 묻고 있습니다.
frodeborli

3

숫자 (컴퓨터에 관한 한)를 표시하지 않고 문자열 또는 일련의 숫자를 표시하기 때문입니다. 물론 숫자를 다루는 일부 앱 (계산기와 같은)은 그러한 숫자를 처리 할 수 ​​있습니다. 그들이 어떤 트릭을 사용하는지 모르겠습니다. 다른 더 정교한 답변 중 일부가 그 내용을 다룰 것이라고 확신합니다.


0

이 답변의 내용의 대부분은 원래 온 이 답변 (다른 질문이 중복으로 표시되기 전에 작성). 따라서 8 비트 값을 사용하는 방법에 대해 논의하지만 (이 질문은 32 비트 값을 요구했지만) 8 비트 값은 개념적으로 이해하기가 더 쉽고 동일한 개념이 32 비트 산술과 같은 더 큰 값에 적용되기 때문에 괜찮습니다.

8 비트 인 두 개의 숫자를 추가하면 가장 큰 숫자를 얻을 수 있습니다 (0xFF + 0xFF = 1FE). 실제로 8 비트 인 두 숫자를 곱하면 얻을 수있는 가장 큰 숫자 (0xFF * 0xFF = 0xFE01)는 여전히 8 비트의 두 배인 16 비트입니다.

이제 x 비트 프로세서가 x 비트 만 추적 할 수 있다고 가정 할 수 있습니다. 예를 들어, 8 비트 프로세서는 8 비트 만 추적 할 수 있습니다. 정확하지 않습니다. 8 비트 프로세서는 8 비트 청크로 데이터를 수신합니다. 이러한 "청크"는 일반적으로 "단어"라는 공식 용어를 사용합니다. 8 비트 프로세서에는 8 비트 단어가 사용됩니다. 64 비트 프로세서에는 64 비트 단어가 사용될 수 있습니다.

따라서 컴퓨터에 3 바이트를 주면
바이트 # 1 : MUL 명령어
바이트 # 2 : 상위 바이트 (예 : 0xA5)
바이트 # 3 : 하위 바이트 (예 : 0xCB)
컴퓨터는 다음과 같은 결과를 생성 할 수 있습니다. 8 비트 이상입니다. CPU는 다음과 같은 결과를 생성 할 수 있습니다.
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka :
0x4082xxxxD7
이제,
다음과 같은 숫자는 16 진수를 의미합니다.
"40"에 대해 좀 더 자세하게 설명하겠습니다.
82는 일련의 8 비트 인 "A"레지스터의 일부입니다.
xx와 xx는 "B"레지스터와 "C"레지스터라는 다른 두 레지스터의 일부입니다. 이러한 비트를 0 또는 1로 채우지 않은 이유는 "ADD"명령어 (CPU로 전송)가 명령어에 의해 해당 비트가 변경되지 않을 수 있기 때문입니다 (이 예제에서 사용하는 대부분의 다른 비트는 일부 플래그 비트를 제외하고 변경됩니다.
D7은 "D"레지스터라고하는 더 많은 비트에 맞습니다.
레지스터는 메모리의 일부일뿐입니다. 레지스터는 CPU에 내장되어 있으므로 CPU는 RAM 스틱의 메모리와 상호 작용할 필요없이 레지스터에 액세스 할 수 있습니다.

따라서 0xA5 곱하기 0xCB의 수학적 결과는 0x82D7입니다.

이제 왜 비트가 A 및 B 레지스터 또는 C 및 D 레지스터 대신 A 및 D 레지스터로 분리 되었습니까? 다시 한 번, 이것은 내가 사용하고있는 샘플 시나리오이며, 개념 상 실제 어셈블리 언어 (Intel x86 16 비트, Intel 8080 및 8088 및 많은 최신 CPU에서 사용되는 개념)와 다소 유사합니다. "C"레지스터 (일반적으로 루프의 경우)를 계산하기위한 인덱스로 사용되는 "C"레지스터 및 메모리 위치를 지정하는 데 도움이되는 오프셋을 추적하는 데 사용되는 "B"레지스터와 같은 일반적인 규칙이있을 수 있습니다. 따라서 "A"와 "D"는 일부 일반적인 산술 함수에서 더 일반적 일 수 있습니다.

각 CPU 명령어에는 Assembly에서 프로그램하는 사람들이 사용하는 문서가 있어야합니다. 이 설명서에는 각 명령어에서 사용되는 레지스터를 지정해야합니다. (따라서 사용할 레지스터에 대한 선택은 종종 어셈블리 언어 프로그래머가 아닌 CPU 디자이너에 의해 지정됩니다. 그러나 약간의 유연성이있을 수 있습니다.)

이제, 위의 예제에서 "40"으로 돌아가서 : "플래그 레지스터"라고도하는 일련의 비트입니다. 플래그 레지스터의 각 비트에는 이름이 있습니다. 예를 들어, 결과가 1 바이트의 결과를 저장할 수있는 공간보다 큰 경우 CPU가 설정할 수있는 "오버 플로우"비트가 있습니다. "오버플로"비트는 종종 "OF"의 약칭으로 참조 될 수 있습니다. 이는 0이 아닌 대문자 o입니다. 소프트웨어는이 플래그의 값을 확인하고 "문제"를 확인할 수 있습니다. 이 비트로 작업하는 것은 종종 고급 언어에 의해 보이지 않게 처리되므로 초보자는 종종 CPU 플래그와 상호 작용하는 방법을 배우지 못합니다. 그러나 어셈블리 프로그래머는 일반적으로 다른 변수와 매우 유사한 방식으로 이러한 플래그 중 일부에 액세스 할 수 있습니다.

예를 들어, 여러 ADD 명령어가있을 수 있습니다. 하나의 ADD 명령어는 16 비트의 결과를 A 레지스터와 D 레지스터에 저장할 수있는 반면, 다른 명령어는 단지 8 개의 하위 비트를 A 레지스터에 저장하고 D 레지스터를 무시하고 오버플로 비트를 지정할 수 있습니다. 그런 다음 나중에 (A 레지스터의 결과를 기본 RAM에 저장 한 후) 8 개의 높은 비트 만 레지스터 (A 레지스터)에 저장하는 다른 ADD 명령어를 사용할 수 있습니다. 오버플로 플래그를 사용해야하는지 여부 사용하는 곱셈 명령어에 따라 다릅니다.

원하는 결과에 맞지 않도록 너무 많이 빼면 일반적으로 "언더 플로우"플래그가 있습니다.

그냥 복잡한 일이 있었는지를 보여 :
인텔 4004는 4 비트 CPU이었다
인텔 8008는 8 비트 CPU했다. A, B, C 및 D라는 8 비트 레지스터가있었습니다
. Intel 8086은 16 비트 CPU였습니다. AX, BX, CX 및 DX라는 16 비트 레지스터가있었습니다.
인텔 80386은 32 비트 CPU였습니다. EAX, EBX, ECX 및 EDX라는 32 비트 레지스터가있었습니다.
Intel x64 CPU에는 RAX, RBX, RCX 및 RDX라는 64 비트 레지스터가 있습니다. x64 칩은 16 비트 코드를 실행할 수 있으며 (일부 작동 모드에서) 16 비트 명령어를 해석 할 수 있습니다. 그렇게 할 때 AX 레지스터를 구성하는 비트는 EAX 레지스터를 구성하는 비트의 절반이며 RAX 레지스터를 구성하는 비트의 절반입니다. 따라서 AX 값을 변경할 때마다 AX에서 사용하는 비트가 RAX에서 사용하는 비트의 일부이기 때문에 EAX 및 RAX도 변경됩니다. EAX를 65,536의 배수로 변경하면 하위 16 비트는 변경되지 않으므로 AX는 변경되지 않습니다. EAX를 65,536의 배수가 아닌 값으로 변경하면 AX에도 영향을 미칩니다. .)

내가 언급 한 것보다 더 많은 플래그와 레지스터가 있습니다. 간단한 개념의 예를 제공하기 위해 일반적으로 사용되는 것을 선택했습니다.

이제 8 비트 CPU를 사용하는 경우 메모리에 쓸 때 4 비트 또는 16 비트 주소가 아닌 8 비트 주소를 참조 할 수 있다는 제한이있을 수 있습니다. 세부 사항은 CPU에 따라 달라 지지만 이러한 제한이있는 경우 CPU가 8 비트 단어를 처리 할 수 ​​있으므로 CPU를 가장 일반적으로 "8 비트 CPU"라고합니다.


나는 내 대답의 일부 가이 질문에 대한 다른 대답을 반복하는 것처럼 느낍니다. 그러나 다른 질문에 대한 내용을 쓴 이후로 내용을 처음 썼을 때 이것은 눈치 채지 못했습니다. 또한 C 언어로 된 일부 코드를 포함한 Animism의 답변에 감사하지만 내 내용은 CPU의 실제 작업 / 디자인에 더 가까운 어셈블리 작동 방식에 대한 세부 정보를 제공한다고 생각했습니다. 그래서 내 대답은 다른 모든 것보다 "더 나은"우월한 대답이 아니라 보충적인 것입니다. 추가 통찰력으로 또 다른 관점 추가
TOOGAM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.