Nếu máy 32 bit chỉ có thể xử lý các số lên tới 2 ^ 32, tại sao tôi có thể viết 1000000000000 (nghìn tỷ) mà không bị hỏng máy?


370

Máy tính 32 bit chỉ có thể lưu trữ các số nguyên đã ký tối đa 2 31 - 1.
Đây là lý do tại sao chúng tôi đã hết địa chỉ IPv4 và đã bước vào kỷ nguyên 64 bit.

Tuy nhiên, số 2 31 - 1 (2.147.483.647) không lớn bằng số 1 nghìn tỷ (1.000.000.000.000) mà tôi dường như có thể hiển thị tốt mà không bị hỏng máy.

Ai đó có thể giải thích tại sao điều này là?


35
Câu hỏi còn thiếu sót. Máy 32 bit có thể xử lý các số lớn hơn nhiều so với 2 ^ 32. Họ làm điều đó mọi lúc, với 'lâu' và cứ thế. Họ chỉ có thể lưu trữ tối đa 2 ^ 32 trong một lần đăng ký, nhưng phần mềm được viết để vượt qua vấn đề này. Một số ngôn ngữ hiện đại thậm chí không có vấn đề với độ dài của một số nhất định.
JFA

23
Hãy giữ ý kiến ​​về chủ đề, lịch sự và liên quan đến các khía cạnh kỹ thuật của câu hỏi. Gần 50 bình luận đùa đã phải được xóa, và chúng tôi muốn tránh phải khóa bài. Cảm ơn bạn.
nhinkle

6
Câu hỏi này đã được viết theo cách hơi cẩu thả. Bạn có ý nghĩa gì khi "viết" và "hiển thị" số 1000000000000? Khi bạn viết câu hỏi bạn đã viết số 1000000000000 và trình duyệt web của bạn hiển thị nó tốt, tôi giả sử, nhưng điều này sẽ không có gì lạ đối với bất kỳ ai đã từng sử dụng máy tính trước đây. Câu hỏi yêu cầu giải thích miễn phí.
HelloGoodbye

7
Ý thức của con người được ước tính chứa khoảng 50 bit (tôi đọc ở đâu đó). Vì vậy, câu hỏi không phải là "Làm thế nào tôi có thể viết 10^9mà không bị hỏng PC?" mà là "Làm thế nào tôi có thể viết 10^(18)mà không bị suy sụp não?"
Hagen von Eitzen

1
Máy tính 32 bit chỉ có thể lưu trữ số nguyên chưa ký tối đa 2 ^ 32 - 1. 2 ^ 32 - 1 thậm chí không bằng 2.147.483.647 ... 300 phiếu bầu và không ai nhận ra điều này?
Koray Tugay

Câu trả lời:


784

Tôi trả lời câu hỏi của bạn bằng cách hỏi bạn một câu khác:

Làm thế nào để bạn đếm trên ngón tay của bạn đến 6?

Bạn có thể đếm đến số lớn nhất có thể bằng một tay, và sau đó bạn chuyển sang tay thứ hai khi bạn hết ngón tay. Máy tính làm điều tương tự, nếu chúng cần biểu thị một giá trị lớn hơn một thanh ghi có thể giữ, chúng sẽ sử dụng nhiều khối 32 bit để làm việc với dữ liệu.


16
Hài hước, @codename. Làm thế nào để bạn đếm trên đầu ngón tay của mình từ 32 trở lên (tức là một khi 2 ^ 5 đã hết)? ;) Sự tương tự của việc chuyển sang tay kia là tốt ... ngay cả khi nhị phân trì hoãn nhu cầu chuyển sang tay kia. Những gì tôi muốn thấy là đếm đến 1.024 hoặc nhiều hơn với sự khéo léo của bàn đạp để di chuyển đến ngón chân của một người để tiếp tục đếm trong nhị phân - lên tới 1.048.575! :) Đó có khả năng là 20 bit sức mạnh của bo mạch chủ. : P
J0e3gan

14
Hãy giữ ý kiến ​​về chủ đề và liên quan để thảo luận về các khía cạnh kỹ thuật của câu trả lời này. Hơn 60 bình luận đùa đã bị xóa khỏi câu trả lời này và chúng tôi muốn tránh phải khóa bài đăng.
nhinkle

@ codename- dễ dàng, bạn chỉ định một ngón tay là con trỏ ngăn xếp. Khi bạn hết ngón tay, bạn thêm số tiền vào ngăn xếp và bắt đầu đếm lại.
Makach

Bạn đã học nó ở đâu, @codename? Tôi đã nghe điều này đầu tiên từ Frederik Pohl, xem ví dụ ở đây hjkeen.net/halqn/f_pohl3.htm
Zane

2
Tôi nghĩ rằng đây không phải là câu trả lời cho câu hỏi liên quan. Trả lời bởi @ Bigbio2002 là câu trả lời đúng. Ở đây "1000000000000" không phải là một số mà là một văn bản, giống như "adsfjhekgnoregrebgoregnkevnregj". Những gì bạn đang nói là đúng, nhưng tôi cảm thấy mạnh mẽ đây không phải là câu trả lời chính xác. Và để thấy rất nhiều người ủng hộ ...
Master Chief

398

Bạn đúng rằng số nguyên 32 bit không thể giữ giá trị lớn hơn 2 ^ 32-1. Tuy nhiên, giá trị của số nguyên 32 bit này và cách nó xuất hiện trên màn hình của bạn là hai điều hoàn toàn khác nhau. Chuỗi in "1000000000000" không được biểu thị bằng số nguyên 32 bit trong bộ nhớ.

Để hiển thị theo nghĩa đen, số "1000000000000" cần 13 byte bộ nhớ. Mỗi byte riêng lẻ có thể chứa giá trị lên tới 255. Không ai trong số họ có thể giữ toàn bộ, giá trị số, nhưng được hiểu riêng là ký tự ASCII (ví dụ: ký tự ' 0' được biểu thị bằng giá trị thập phân 48, giá trị nhị phân 00110000), họ có thể được xâu chuỗi lại thành một định dạng có ý nghĩa đối với bạn, một con người.


Một khái niệm liên quan trong lập trình là typecasting , đó là cách máy tính sẽ diễn giải một luồng 0s và 1s cụ thể. Như trong ví dụ trên, nó có thể được hiểu là một giá trị số, một ký tự hoặc thậm chí là một cái gì đó hoàn toàn khác. Mặc dù số nguyên 32 bit có thể không giữ được giá trị 1000000000000, nhưng số dấu phẩy động 32 bit sẽ có thể, sử dụng một cách hiểu hoàn toàn khác.

Về cách các máy tính có thể làm việc với và xử lý số lượng lớn bên trong, tồn tại các số nguyên 64 bit (có thể chứa các giá trị lên tới 16 tỷ tỷ), các giá trị dấu phẩy động, cũng như các thư viện chuyên dụng có thể hoạt động với số lượng lớn tùy ý số.


22
Trên thực tế điều đó là chính xác nhưng không hoàn toàn. Số dấu phẩy động 32 điểm khó có thể thể hiện chính xác 1000000000000. Nó sẽ đại diện cho một số rất gần với số mong muốn nhưng không chính xác.
Tim B

6
@TimB: Bạn đã nghe nói về định dạng thập phân32 chưa? Đây là một phần của tiêu chuẩn IEEE 754-2008. Định dạng này có khả năng đại diện chính xác cho số này :)
VX

15
Đúng, có thể. Tuy nhiên, đó không phải là định dạng mà mọi người muốn nói khi họ nói "float", thường nói đến số dấu phẩy động 32 bit được lưu trữ và sử dụng bởi các bộ xử lý dấu phẩy động tiêu chuẩn trong các máy tính hiện tại.
Tim B

2
@TimB thực sự. Số gần nhất với số có thể được biểu thị dưới dạng float32 là 999999995904
greggo

4
@TimB: Nhưng số dấu phẩy động 64 bit có thể dễ dàng biểu diễn 1000000000000chính xác. Đó là 10 ^ 12 hoặc 2 ^ 12 * 5 ^ 12; 5 ^ 12 yêu cầu 28 bit của mantissa.
Keith Thompson

191

Đầu tiên và quan trọng nhất, máy tính 32 bit có thể lưu trữ số lượng lên tới 2³²-1 trong một từ máy . Từ máy là lượng dữ liệu mà CPU có thể xử lý theo cách tự nhiên (nghĩa là các thao tác trên dữ liệu có kích thước đó được thực hiện trong phần cứng và thường được thực hiện nhanh nhất). CPU 32 bit sử dụng các từ bao gồm 32 bit, do đó chúng có thể lưu trữ các số từ 0 đến 2³²-1 trong một từ .

Thứ hai, 1 nghìn tỷ1000000000000 là hai điều khác nhau.

  • 1 nghìn tỷ là một khái niệm trừu tượng về số
  • 1000000000000 là văn bản

Bằng cách nhấn 1một lần và sau đó 012 lần bạn đang gõ văn bản. 1đầu vào 1, 0đầu vào 0. Xem? Bạn đang gõ ký tự. Nhân vật không phải là số. Máy đánh chữ hoàn toàn không có CPU hoặc bộ nhớ và họ đã xử lý các "số" như vậy khá tốt, vì đó chỉ là văn bản.

Bằng chứng là 1000000000000 không phải là một số, nhưng văn bản: nó có thể có nghĩa là 1 nghìn tỷ (ở dạng thập phân), 4096 (ở dạng nhị phân) hoặc 281474976710656 (ở hệ thập lục phân). Nó thậm chí còn có nhiều ý nghĩa hơn trong các hệ thống khác nhau. Ý nghĩa của 1000000000000 là một con số và lưu trữ nó là một câu chuyện khác nhau (chúng ta sẽ quay lại với nó trong giây lát).

Để lưu trữ văn bản (trong lập trình, nó được gọi là chuỗi ) 1000000000000 bạn cần 14 byte (một byte cho mỗi ký tự cộng với một byte NULL kết thúc có nghĩa là "chuỗi kết thúc tại đây"). Đó là 4 từ máy. 3 rưỡi là đủ, nhưng như tôi đã nói, thao tác trên các từ máy là nhanh nhất. Giả sử ASCII được sử dụng để lưu trữ văn bản, do đó, trong bộ nhớ, nó sẽ trông như thế này: (chuyển đổi mã ASCII tương ứng 01thành nhị phân, mỗi từ trong một dòng riêng biệt)

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

Bốn ký tự vừa với một từ, phần còn lại được chuyển sang từ tiếp theo. Phần còn lại được chuyển sang từ tiếp theo cho đến khi mọi thứ (bao gồm byte NULL đầu tiên) phù hợp.

Bây giờ, trở lại để lưu trữ số. Nó hoạt động giống như với văn bản tràn, nhưng chúng được trang bị từ phải sang trái. Nghe có vẻ phức tạp, vì vậy đây là một ví dụ. Vì mục đích đơn giản, hãy giả sử rằng:

  • máy tính tưởng tượng của chúng tôi sử dụng thập phân thay vì nhị phân
  • một byte có thể chứa số 0..9
  • một từ bao gồm hai byte

Đây là bộ nhớ 2 từ trống:

0 0
0 0

Hãy lưu trữ số 4:

0 4
0 0

Bây giờ hãy thêm 9:

1 3
0 0

Lưu ý rằng cả hai toán hạng sẽ phù hợp trong một byte, nhưng không phải là kết quả. Nhưng chúng tôi có một cái khác đã sẵn sàng để sử dụng. Bây giờ hãy lưu trữ 99:

9 9
0 0

Một lần nữa, chúng tôi đã sử dụng byte thứ hai để lưu trữ số. Hãy thêm 1:

0 0
0 0

Rất tiếc ... Đó được gọi là tràn số nguyên và là nguyên nhân của nhiều vấn đề nghiêm trọng, đôi khi rất tốn kém .

Nhưng nếu chúng ta hy vọng rằng tràn sẽ xảy ra, chúng ta có thể làm điều này:

0 0
9 9

Và bây giờ thêm 1:

0 1
0 0

Nó trở nên rõ ràng hơn nếu bạn loại bỏ các khoảng trắng và dòng mới phân tách byte:

0099    | +1
0100

Chúng tôi đã dự đoán rằng tràn có thể xảy ra và chúng tôi có thể cần thêm bộ nhớ. Xử lý các số theo cách này không nhanh bằng các số phù hợp với các từ đơn và nó phải được thực hiện trong phần mềm. Việc thêm hỗ trợ cho các số hai từ 32 bit vào CPU 32 bit có hiệu quả làm cho nó trở thành CPU 64 bit (bây giờ nó có thể hoạt động trên các số 64 bit, đúng không?).

Tất cả mọi thứ tôi đã mô tả ở trên đều áp dụng cho bộ nhớ nhị phân với các byte 8 bit và các từ 4 byte cũng vậy, nó hoạt động khá giống nhau:

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

Chuyển đổi số như vậy sang hệ thống thập phân là khó khăn, mặc dù. (nhưng nó hoạt động khá tốt với hệ thập lục phân )


21
Câu trả lời của bạn đọc khá hạ thấp. OP rõ ràng đang nói về số lượng, không phải văn bản : large as the number 1 trillion (1000000000000). Ngoài ra, bạn gần như đang nói về số học chính xác tùy ý , nhưng bạn không bao giờ thực sự đề cập đến bất kỳ điều khoản nào cho những gì bạn đang nói ....
MirroredFate

12
"1 nghìn tỷ" cũng là một chuỗi
Elzo Valugi

3
@ElzoValugi Chính là nó. Tôi đã phải tìm một cách nào đó để trình bày khái niệm số trừu tượng, trái ngược với chuỗi đại diện cho một số. Tôi tin rằng "1 nghìn tỷ" là cách tốt hơn và ít mơ hồ hơn để làm điều đó (xem bằng chứng trong câu trả lời).
gronostaj

25
@MirroredFate Tôi không đồng ý với 'rõ ràng đang nói về con số'. OP nói 'hiển thị tốt', trong đó rõ ràng đang nói về văn bản '1000000000000' với tôi ...
Joe

4
@yannbane 'A' là một ký tự chứ không phải số. '?' là một nhân vật và không phải là một con số '1' là một ký tự và không phải là một số quá. Nhân vật chỉ là biểu tượng. Chúng có thể đại diện cho chữ số hoặc số, nhưng chắc chắn chúng không phải là số. '1' có thể là viết tắt của một, mười, trăm, nghìn, v.v., nó chỉ là một biểu tượng tượng trưng cho một chữ số có thể là một số hoặc một phần của nó. '10' (chuỗi ký tự) có thể có nghĩa là hai hoặc tám hoặc mười hoặc mười sáu, v.v. nhưng khi bạn nói bạn có mười quả táo, bạn đang sử dụng số mười và mọi người đều hiểu ý của bạn. Có một sự khác biệt rất lớn giữa các ký tự và số.
gronostaj

40

Bạn cũng có thể viết "TUYÊN BỐ NÀY LÀ FALSE" mà không bị sập máy tính của bạn :) @ Câu trả lời của Scott là tại chỗ cho một số khung tính toán nhất định, nhưng câu hỏi của bạn về "viết" một số lượng lớn ngụ ý rằng đó chỉ là văn bản đơn giản, ít nhất là cho đến khi nó được giải thích.

Chỉnh sửa: bây giờ với ít châm biếm thông tin hữu ích hơn về các cách khác nhau, một số có thể được lưu trữ trong bộ nhớ. Tôi sẽ mô tả những điều này với độ trừu tượng cao hơn, tức là về mặt lập trình viên hiện đại có thể viết mã trước khi nó được dịch sang mã máy để thực thi.

Dữ liệu trên máy tính phải được giới hạn ở một loại nhất định và định nghĩa máy tính thuộc loại đó mô tả những thao tác nào có thể được thực hiện trên dữ liệu này và cách (ví dụ so sánh số, ghép văn bản hoặc XOR một boolean). Bạn không thể chỉ cần thêm văn bản vào một số, giống như bạn không thể nhân một số với văn bản để một số giá trị này có thể được chuyển đổi giữa các loại.

Hãy bắt đầu với số nguyên không dấu . Trong các loại giá trị này, tất cả các bit được sử dụng để lưu trữ thông tin về chữ số; bạn là một ví dụ về một số nguyên unsigned 32-bit nơi bất kỳ giá trị từ 0để 2^32-1có thể được lưu trữ. Và có, tùy thuộc vào ngôn ngữ hoặc kiến ​​trúc của nền tảng được sử dụng, bạn có thể có số nguyên 16 bit hoặc số nguyên 256 bit.

Điều gì nếu bạn muốn nhận được tiêu cực? Theo trực giác, số nguyên đã ký là tên của trò chơi. Công ước là phân bổ tất cả các giá trị từ -2^(n-1)đến 2^(n-1)-1- theo cách này, chúng tôi tránh sự nhầm lẫn khi phải xử lý hai cách để viết +0-0. Vì vậy, một số nguyên có chữ ký 32 bit sẽ giữ một giá trị từ -2147483648đến 2147483647. Không, phải không?

Ok, chúng tôi đã bao gồm các số nguyên là các số không có thành phần thập phân. Thể hiện những điều này là khó khăn hơn: phần không nguyên có thể chỉ có thể ở đâu đó giữa 01, vì vậy mỗi bit được sử dụng để mô tả nó sẽ tăng độ chính xác của nó: 1/2, 1/4, 1/8 ... Vấn đề là, bạn không thể diễn tả chính xác một số thập phân đơn giản 0.1dưới dạng tổng của các phân số chỉ có thể có lũy thừa bằng hai trong mẫu số của chúng! Sẽ không dễ dàng hơn nhiều để lưu trữ số dưới dạng một số nguyên, nhưng đồng ý đặt điểm cơ số (thập phân) thay thế? Đây được gọi là số điểm cố định , nơi chúng tôi lưu trữ 1234100nhưng đồng ý về một quy ước để đọc nó 1234.100thay vào đó.

Một loại tương đối phổ biến hơn được sử dụng để tính toán là floating point. Cách thức hoạt động thực sự gọn gàng, nó sử dụng một bit để lưu trữ giá trị dấu, sau đó một số để lưu trữ số mũ và ý nghĩa. Có các tiêu chuẩn xác định phân bổ như vậy, nhưng đối với số float 32 bit , số lượng tối đa bạn có thể lưu trữ là quá nhiều

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

Điều này tuy nhiên đi kèm với chi phí chính xác. JavaScript có sẵn trong các trình duyệt sử dụng số float 64 bit và nó vẫn không thể làm mọi thứ đúng. Chỉ cần sao chép này vào thanh địa chỉ và nhấn enter. Spoiler alert: kết quả sẽ không được 0.3.

javascript:alert(0.1+0.2);

Có nhiều loại thay thế khác như Microsoft .NET 4.5 BigInteger, về mặt lý thuyết không có giới hạn trên hoặc dưới và phải được tính theo "lô"; nhưng có lẽ các công nghệ hấp dẫn hơn là những công nghệ hiểu toán học, như công cụ Wolfram Mathematica, có thể hoạt động chính xác với các giá trị trừu tượng như vô cực .


8
Bạn có thể làm điều đó trong thực tế này . Hãy thử làm điều đó trong vũ trụ Star Trek. Chỉ cần đứng lại trước, vì tất cả các tia lửa và khói.
Michael Petrotta

Đó không phải là chính xác làm thế nào điểm cố định hoạt động. Nó thực sự là một hệ thống trong đó các số được chia tỷ lệ và sai lệch để tạo ra dấu thập phân. Trong ví dụ của bạn, tỷ lệ là 1/1000, nhưng cũng có các số điểm cố định (đặc biệt là trong đồ họa máy tính) như thế này: 0 = 0,0, 255 = 1.0 - tỷ lệ là 1/255.
Andon M. Coleman

31

Điều quan trọng là hiểu cách máy tính mã hóa số.

Đúng, nếu một máy tính khăng khăng lưu trữ số bằng cách sử dụng biểu diễn nhị phân đơn giản của số bằng một từ duy nhất (4 byte trên hệ thống 32 bit), thì máy tính 32 bit chỉ có thể lưu trữ số tối đa 2 ^ 32. Nhưng có rất nhiều cách khác để mã hóa số tùy thuộc vào những gì bạn muốn đạt được với chúng.

Một ví dụ là cách máy tính lưu trữ số dấu phẩy động. Máy tính có thể sử dụng một loạt các cách khác nhau để mã hóa chúng. Chuẩn IEEE 754 xác định quy tắc cho các số mã hóa lớn hơn 2 ^ 32. Một cách thô bạo, máy tính có thể thực hiện điều này bằng cách chia 32 bit thành các phần khác nhau đại diện cho một số chữ số của số và các bit khác đại diện cho kích thước của số (tức là số mũ, 10 ^ x). Điều này cho phép phạm vi lớn hơn nhiềuvề số lượng theo kích thước, nhưng ảnh hưởng đến độ chính xác (phù hợp với nhiều mục đích). Tất nhiên, máy tính cũng có thể sử dụng nhiều hơn một từ cho mã hóa này làm tăng độ chính xác về độ lớn của các số được mã hóa có sẵn. Phiên bản 32 thập phân đơn giản của tiêu chuẩn IEEE cho phép các số có độ chính xác khoảng 7 chữ số thập phân và các số có độ lớn lên tới khoảng 10 ^ 96.

Nhưng có nhiều lựa chọn khác nếu bạn cần độ chính xác cao hơn. Rõ ràng bạn có thể sử dụng nhiều từ hơn trong mã hóa của mình mà không giới hạn (mặc dù với hình phạt hiệu suất để chuyển đổi sang và ra khỏi định dạng được mã hóa). Nếu bạn muốn khám phá một cách có thể thực hiện được thì có một bổ trợ nguồn mở tuyệt vời cho Excel sử dụng sơ đồ mã hóa cho phép tính toán hàng trăm chữ số chính xác. Bổ trợ được gọi là Xnumbers và có sẵn ở đây . Mã trong Visual Basic không phải là nhanh nhất có thể nhưng có ưu điểm là dễ hiểu và sửa đổi. Đó là một cách tuyệt vời để tìm hiểu làm thế nào máy tính đạt được mã hóa số dài hơn. Và bạn có thể chơi xung quanh với các kết quả trong Excel mà không phải cài đặt bất kỳ công cụ lập trình nào.


24

Đó là tất cả trong câu hỏi của bạn.

Bạn có thể viết bất kỳ số nào bạn thích trên giấy. Hãy thử viết một nghìn tỷ chấm trên một tờ giấy trắng. Nó chậm và không hiệu quả. Đó là lý do tại sao chúng tôi có một hệ thống 10 chữ số để thể hiện những con số lớn đó. Chúng tôi thậm chí có tên cho các số lớn như "triệu", "nghìn tỷ" và nhiều hơn nữa, vì vậy bạn không nói one one one one one one one one one one one...to.

Bộ xử lý 32 bit được thiết kế để hoạt động nhanh nhất và hiệu quả nhất với các khối bộ nhớ dài chính xác 32 chữ số nhị phân. Nhưng chúng tôi, mọi người, thường sử dụng hệ thống số 10 chữ số và máy tính, là điện tử, sử dụng hệ thống 2 chữ số ( nhị phân ). Các số 32 và 64 chỉ là sức mạnh của 2. Chẳng hạn, một triệu và một nghìn tỷ là sức mạnh của 10. Chúng ta dễ dàng hoạt động với những con số này hơn là vô số 65536, chẳng hạn.

Chúng tôi chia số lớn thành chữ số khi chúng tôi viết chúng trên giấy. Máy tính chia số thành một số lớn hơn các chữ số. Chúng tôi có thể viết ra bất kỳ số nào chúng tôi thích, và máy tính cũng vậy nếu chúng tôi thiết kế chúng như vậy.


15

32 bit và 64 bit đề cập đến địa chỉ bộ nhớ. Bộ nhớ máy tính của bạn giống như hộp thư bưu điện, mỗi hộp có một địa chỉ khác nhau. CPU (Bộ xử lý trung tâm) sử dụng các địa chỉ đó để xác định vị trí bộ nhớ trên RAM (Bộ nhớ truy cập ngẫu nhiên). Khi CPU chỉ có thể xử lý các địa chỉ 16 bit, bạn chỉ có thể sử dụng 32mb RAM (có vẻ như rất lớn vào thời điểm đó). Với 32 bit, nó đã tăng lên 4 + gb (có vẻ như rất lớn vào thời điểm đó). Bây giờ chúng ta có địa chỉ 64 bit, RAM đi vào terabyte (có vẻ rất lớn).
Tuy nhiên, chương trình có thể phân bổ nhiều khối bộ nhớ cho những thứ như lưu trữ số và văn bản, tùy thuộc vào chương trình và không liên quan đến kích thước của từng địa chỉ. Vì vậy, một chương trình có thể cho CPU biết, tôi sẽ sử dụng 10 khối lưu trữ địa chỉ và sau đó lưu trữ một số lượng rất lớn hoặc chuỗi 10 ký tự hoặc bất cứ điều gì.
Lưu ý bên: Địa chỉ bộ nhớ được trỏ đến bởi "con trỏ", vì vậy giá trị 32 và 64 bit có nghĩa là kích thước của con trỏ được sử dụng để truy cập bộ nhớ.


2
Câu trả lời tốt ngoại trừ các chi tiết - 16 bit không gian địa chỉ cung cấp cho bạn 64kb, không phải 32mb và các máy như 286 có địa chỉ 24 bit (cho 16mb). Ngoài ra, với địa chỉ 64 bit, bạn vượt xa terabyte - giống như 16 exabyte - terabyte xung quanh loại bo mạch chủ / CPU của thế hệ hiện tại đang áp đặt - không phải kích thước của địa chỉ.
Phil

4
32-bit chỉ kích thước từ của máy, không phải địa chỉ bộ nhớ. Như Phil đã đề cập, 286 là CPU 16 bit nhưng sử dụng 24 bit để đánh địa chỉ thông qua phân đoạn bộ nhớ. CPU x86 là 32 bit, nhưng sử dụng địa chỉ 36 bit. Xem PAE .
gronostaj

@gronostaj well x86 có địa chỉ 32 bit từ 386 đến Pentium.
Ruslan

Upvote bởi vì đây là câu trả lời ĐÚNG duy nhất ở đây - 32 bit đề cập đến địa chỉ bộ nhớ 32 bit, không phải số học 32 bit.
dùng1207217

@ người dùng1207217: ?? Vì vậy, theo lý luận của bạn, ví dụ Z80 hoặc 8080 là bộ xử lý 16 bit (vì địa chỉ bộ nhớ 16 bit và bus bộ nhớ)?
pabouk

13

Bởi vì hiển thị số được thực hiện bằng cách sử dụng các ký tự riêng lẻ, không phải số nguyên. Mỗi chữ số trong số được biểu thị bằng một ký tự riêng, có giá trị nguyên được xác định bởi mã hóa đang được sử dụng, ví dụ 'a'được biểu thị bằng giá trị ascii 97, trong khi '1'được biểu thị bằng 49. Kiểm tra bảng ascii ở đây .
Để hiển thị cả 'a' và '1' là như nhau. Họ là những nhân vật, không phải là số nguyên. Mỗi ký tự bằng chữ được phép có giá trị tối đa 255 trong nền tảng 32 bit lưu trữ giá trị ở kích thước 8 bit hoặc 1 byte (Điều đó phụ thuộc vào nền tảng, tuy nhiên 8 bit là kích thước ký tự phổ biến nhất), do đó chúng có thể được nhóm lại với nhau và có thể được nhóm lại với nhau hiển thị. Chúng có thể hiển thị bao nhiêu ký tự riêng biệt tùy thuộc vào RAM bạn có. Nếu bạn chỉ có 1 byte RAM thì bạn có thể chỉ hiển thị một ký tự, nếu bạn có 1GB RAM, bạn có thể hiển thị tốt 1024 * 1024 * 1024 ký tự (Quá lười để làm toán).

Tuy nhiên, giới hạn này áp dụng cho các tính toán, tuy nhiên tôi đoán bạn quan tâm đến tiêu chuẩn IPV4. Mặc dù nó không hoàn toàn liên quan đến máy tínhbit-size, nó bằng cách nào đó đã ảnh hưởng đến các tiêu chuẩn. Khi tiêu chuẩn IPV4 được tạo, họ đã lưu trữ các giá trị ip theo số nguyên 32 bit. Bây giờ một khi bạn đã cho kích thước, và nó đã trở thành tiêu chuẩn. Mọi thứ chúng tôi biết về internet đều phụ thuộc vào điều đó, và sau đó chúng tôi đã hết địa chỉ IP để gán. Vì vậy, nếu tiêu chuẩn IP được sửa đổi thành 64 bit, mọi thứ sẽ ngừng hoạt động, bao gồm cả bộ định tuyến của bạn (tôi cho rằng điều này là chính xác) và các thiết bị mạng khác. Vì vậy, một tiêu chuẩn mới phải được tạo ra, chỉ cần hoán đổi số nguyên 32 bit với 128 bit một. Và điều chỉnh phần còn lại của tiêu chuẩn. Nhà sản xuất phần cứng chỉ cần tuyên bố rằng họ hỗ trợ tiêu chuẩn mới này và nó sẽ bị virus. Mặc dù nó không đơn giản, nhưng tôi đoán bạn đã hiểu rõ ở đây.

Tuyên bố miễn trừ trách nhiệm: Hầu hết các điểm được đề cập ở đây là đúng với giả định của tôi. Tôi có thể đã bỏ lỡ những điểm quan trọng ở đây để làm cho nó đơn giản hơn. Tôi không giỏi về các con số, vì vậy chắc chắn đã bỏ lỡ một số chữ số, nhưng quan điểm của tôi ở đây là trả lời câu trả lời của OP về lý do tại sao nó không bị sập PC.


2
Tôi đã không đánh giá thấp, nhưng có một số vấn đề với câu trả lời của bạn. 1là 0x31 trong ASCII, không phải 0x1. 1 GB = 1024 ^ 3 B. Đã tạo ra IPv4 trước khi CPU 32 bit được giới thiệu, do đó, việc nói rằng các địa chỉ được lưu trữ trong các số nguyên 32 bit có mâu thuẫn với câu hỏi của OP. Và cuối cùng IPv6 đang sử dụng địa chỉ 128 bit, không phải 64 bit.
gronostaj

13

Trong bộ xử lý, có "từ". Có những từ khác nhau. Khi mọi người nói "bộ xử lý 32 bit", họ có nghĩa chủ yếu là "chiều rộng bus bộ nhớ". Từ này bao gồm các "trường" khác nhau, dùng để chỉ các hệ thống con của máy tính tương ứng với việc truyền (24 bit) và điều khiển (các bit khác). Tôi có thể sai về con số chính xác, hãy chắc chắn về nó thông qua hướng dẫn.

Khía cạnh hoàn toàn khác nhau là tính toán. Các tập lệnh SSE và MMX có thể lưu trữ các số nguyên dài. Chiều dài tối đa mà không giảm năng suất phụ thuộc vào phiên bản SSE hiện tại nhưng luôn có khoảng 64 bit.

Các bộ xử lý Opteron hiện tại có thể xử lý các số rộng 256 bit (tôi không chắc chắn về số nguyên, nhưng chắc chắn là float).

Tóm tắt : (1) chiều rộng xe buýt không được kết nối trực tiếp với chiều rộng tính toán, (2) thậm chí các từ khác nhau (từ bộ nhớ, từ đăng ký, từ bus, v.v.) không được kết nối với nhau, sau đó chúng có ước số chung khoảng 8 hoặc 16 hoặc 24. Nhiều bộ xử lý thậm chí đã sử dụng từ 6 bit (nhưng lịch sử của nó).


Không đúng, bộ xử lý Pentium ban đầu có bus dữ liệu 64 bit cho băng thông bộ nhớ cao, mặc dù đó là bộ xử lý 32 bit. 8088 là bộ xử lý 16 bit với bus dữ liệu 8 bit.
doug65536

10

Mục đích của một thiết bị điện toán, nói chung, là chấp nhận, xử lý, lưu trữ và phát ra dữ liệu. Phần cứng cơ bản chỉ là một cỗ máy giúp thực hiện bốn chức năng đó. Nó không thể làm gì trong số đó nếu không có phần mềm.

Phần mềm là mã cho máy biết cách chấp nhận dữ liệu, cách xử lý, cách lưu trữ và cách cung cấp cho người khác.

Phần cứng cơ bản sẽ luôn có những hạn chế. Trong trường hợp máy 32 bit, hầu hết các thanh ghi xử lý dữ liệu chỉ rộng 32 bit. Tuy nhiên, điều này không có nghĩa là máy không thể xử lý các số vượt quá 2 ^ 32, điều đó có nghĩa là nếu bạn muốn xử lý số lớn hơn, có thể máy phải mất hơn một chu kỳ để chấp nhận, xử lý, lưu trữ nó, hoặc phát ra nó

Phần mềm cho máy biết cách xử lý số. Nếu phần mềm được thiết kế để xử lý số lượng lớn, nó sẽ gửi một loạt các hướng dẫn đến CPU để cho nó biết cách xử lý các số lớn hơn. Ví dụ, số của bạn có thể được biểu thị bằng hai thanh ghi 32 bit. Nếu bạn muốn thêm 1,234 vào số của mình, phần mềm sẽ yêu cầu CPU trước tiên thêm 1,234 vào thanh ghi thấp hơn, sau đó kiểm tra bit tràn để xem liệu bổ sung đó có dẫn đến một số quá lớn cho thanh ghi thấp hơn không. Nếu có, thì nó thêm 1 vào thanh ghi trên.

Cũng giống như cách các học sinh tiểu học được dạy để thêm với carry, CPU có thể được yêu cầu xử lý các số lớn hơn số lượng có thể giữ trong một thanh ghi. Điều này đúng với hầu hết các phép toán chung, cho các số có kích thước thực tế.


10

Sự khác biệt nằm ở cách chúng ta lưu trữ dữ liệu trong máy tính.

Bạn đúng rằng đối với máy 8 bit lý thuyết, chúng tôi chỉ có thể lưu trữ 2 ^ 8 giá trị trong một thanh ghi bộ xử lý hoặc địa chỉ bộ nhớ. (Xin lưu ý rằng điều này thay đổi từ "máy" sang "máy" dựa trên bộ xử lý được sử dụng, kiến ​​trúc bộ nhớ, v.v. Nhưng bây giờ, hãy gắn bó với một máy 'rập khuôn' giả định.)

Đối với máy 16 bit lý thuyết, giá trị tối đa ở vị trí thanh ghi / bộ nhớ sẽ là 2 ^ 16, đối với máy 32 bit, 2 ^ 32, v.v.

Trong những năm qua, các lập trình viên đã nghĩ ra tất cả các loại máy tính để lưu trữ và xử lý số lượng lớn hơn mức có thể được lưu trữ trong một thanh ghi bộ xử lý hoặc địa chỉ bộ nhớ. Nhiều phương thức tồn tại, nhưng tất cả chúng đều liên quan đến việc sử dụng nhiều hơn một địa chỉ thanh ghi / bộ nhớ để lưu trữ các giá trị lớn hơn độ rộng vị trí đăng ký / bộ nhớ "gốc" của chúng.

Tất cả các phương pháp này đều có lợi ở chỗ máy có thể lưu trữ / xử lý các giá trị lớn hơn công suất gốc của chúng. Nhược điểm là hầu hết tất cả các phương pháp tiếp cận đều yêu cầu nhiều hướng dẫn / đọc / máy. để xử lý những con số này. Đối với số lượng lớn thường xuyên, đây không phải là một vấn đề. Khi xử lý nhiều số lượng lớn (đặc biệt là địa chỉ bộ nhớ lớn), chi phí liên quan sẽ làm mọi thứ chậm lại.

Do đó, mong muốn chung là làm cho các thanh ghi, vị trí bộ nhớ và phần cứng địa chỉ bộ nhớ "rộng hơn" và rộng hơn để xử lý số lượng lớn "nguyên bản" để các số đó có thể được xử lý với số lượng hoạt động tối thiểu.

Vì kích thước số là vô hạn, nên thanh ghi / kích thước bộ nhớ / địa chỉ bộ xử lý luôn là sự cân bằng của kích thước số gốc và các chi phí liên quan đến việc thực hiện độ rộng lớn hơn và lớn hơn.


8

Máy tính 32 bit chỉ có thể lưu trữ số lượng tối đa 2 ^ 32 trong một từ máy, nhưng điều đó không có nghĩa là chúng không thể xử lý các thực thể dữ liệu lớn hơn.

Ý nghĩa của máy tính 32 bit nói chung là bus dữ liệu và bus địa chỉ rộng 32 bit, có nghĩa là máy tính có thể xử lý 4 GB không gian địa chỉ bộ nhớ cùng một lúc và gửi bốn byte dữ liệu cùng một lúc qua bus dữ liệu .

Tuy nhiên, điều đó không giới hạn máy tính xử lý nhiều dữ liệu hơn, nó chỉ phải chia dữ liệu thành bốn phần byte khi nó gửi qua bus dữ liệu.

Bộ xử lý Intel 32 bit thông thường có thể xử lý các số 128 bit bên trong, cho phép bạn xử lý các số như 1000000000000000000000000000000000000000000 mà không gặp vấn đề gì.

Bạn có thể xử lý các số lớn hơn nhiều so với trong máy tính, nhưng sau đó các tính toán phải được thực hiện bằng phần mềm, CPU không có hướng dẫn xử lý các số lớn hơn 128 bit. (Nó có thể xử lý số lớn hơn nhiều dưới dạng số dấu phẩy động, nhưng sau đó bạn chỉ có 15 chữ số chính xác.)


6

Chỉ cần thêm một ghi chú cho nhiều câu trả lời khác, bởi vì đây là một thực tế khá quan trọng trong câu hỏi này đã bị bỏ qua.

"32 bit" chỉ độ rộng địa chỉ bộ nhớ. Nó không có gì để làm với kích thước đăng ký. Nhiều CPU 32 bit có khả năng có các thanh ghi 64 hoặc thậm chí 128 bit. Cụ thể là đề cập đến dòng sản phẩm x86, các CPU tiêu dùng gần đây, tất cả đều là 64 bit, sở hữu các thanh ghi lên tới 256 bit cho các mục đích đặc biệt.

Sự khác biệt này giữa chiều rộng thanh ghi và độ rộng địa chỉ đã tồn tại từ thời cổ đại, khi chúng ta có các thanh ghi 4 bit và địa chỉ 8 bit, hoặc ngược lại.

Thật đơn giản để thấy rằng việc lưu trữ một số lượng lớn không có vấn đề gì bất kể kích thước đăng ký, như được giải thích trong các câu trả lời khác.

Lý do tại sao các thanh ghi, dù có kích thước như thế nào, cũng có thể tính toán với số lượng lớn hơn, là các phép tính quá lớn có thể được chia thành nhiều số nhỏ hơn phù hợp với các thanh ghi (nó chỉ phức tạp hơn một chút thực tế).


Điều đó không thực sự đúng; những gì 64 bit đề cập là không nhất quán, nhưng các hệ thống có độ rộng thanh ghi 64 bit thường được gọi là 64 bit. Wikipedia nói rằng "một kiến ​​trúc máy tính 64 bit thường có các thanh ghi số nguyên và địa chỉ rộng 64 bit". Đúng, dòng sản phẩm x86 (hoặc AMD-64) hiện đại có các thanh ghi mục đích đặc biệt rất lớn, nhưng chúng có các thanh ghi chính 64 bit và có thể truy cập 48-52 bit bộ nhớ; các hệ thống x86 cũ hơn có các thanh ghi chính 32 bit và truy cập 24-36 bit bộ nhớ và 8086 được gọi là chip 16 bit, có các thanh ghi rộng 16 bit và truy cập 20 bit bộ nhớ.
prosfilaes

@prosfilaes Đó là rất nhiều thông tin có giá trị, tôi đã đề cập đến những thông tin đó (Tôi không nhớ được chi tiết cũng như bạn đã làm). Hãy chỉnh sửa điều này thành câu trả lời.
mafu

6

Các câu trả lời đã được đưa ra thực sự khá tốt, nhưng chúng có xu hướng giải quyết vấn đề từ các khía cạnh khác nhau và do đó đưa ra một bức tranh không hoàn chỉnh. Theo tôi thì chúng cũng hơi quá kỹ thuật.

Vì vậy, chỉ cần làm rõ điều gì đó được gợi ý nhưng không được thể hiện rõ ràng trong bất kỳ câu trả lời nào khác, và điều mà tôi nghĩ là mấu chốt của vấn đề:

Bạn đang trộn lẫn một số khái niệm trong câu hỏi của bạn và một trong số chúng ("32 bit") thực sự có thể đề cập đến nhiều điều khác nhau (và các câu trả lời khác nhau đã đưa ra các cách hiểu khác nhau). Các khái niệm này đều có liên quan đến số bit (1 và 0) được sử dụng (hoặc có sẵn) trong các bối cảnh điện toán khác nhau (ý tôi muốn nói là hy vọng sẽ được làm rõ bằng các ví dụ bên dưới), nhưng các khái niệm này không liên quan .

Rõ ràng:

  • "IPv4 / 6" dùng để chỉ giao thức internet , một bộ quy tắc xác định cách thông tin sẽ được đóng gói và diễn giải trên internet. Điểm khác biệt chính (hoặc ít nhất là nổi tiếng nhất) giữa IPv4 và IPv6 là không gian địa chỉ (tức là tập hợp các địa chỉ có thể được sử dụng để phân biệt giữa các vị trí khác nhau trên mạng) lớn hơn trong IPv6. Điều này có liên quan đến việc có bao nhiêu bit trong mỗi gói dữ liệu được gửi trên mạng được phân bổ cho (nghĩa là dành riêng cho mục đích) xác định người gửi và người nhận dự định của gói.
    • Tương tự không tính toán: Mỗi gói giống như một bức thư được gửi qua thư điện tử và không gian địa chỉ giống như số lượng ký tự bạn "được phép" sử dụng khi viết địa chỉ và địa chỉ trả lại trên phong bì.
    • Tôi không thấy điều này được đề cập trong bất kỳ câu trả lời nào khác cho đến nay.
  • "Từ" bộ nhớ máy tính (32 bit và 64 bit) thường có thể được coi là phần dữ liệu nhỏ nhất mà máy tính sử dụng hoặc "nghĩ" trong. Các bit dữ liệu này kết hợp với nhau để tạo ra các bit dữ liệu khác , chẳng hạn như khối văn bản hoặc số nguyên lớn hơn.
  • Con trỏ 32 bit có thể hoặc không thể là từ, nhưng chúng vẫn được xử lý nguyên tử (nghĩa là các đơn vị riêng lẻ không thể chia thành các thành phần nhỏ hơn). Con trỏ là cách ở mức thấp nhất trong đó một máy tính có thể ghi lại vị trí trong bộ nhớ của một số dữ liệu tùy ý. Lưu ý rằng kích thước con trỏ được sử dụng bởi máy tính (hoặc, thực sự, bởi hệ điều hành) giới hạn phạm vi bộ nhớ có thể được truy cập bởi một con trỏ, vì chỉ có nhiều vị trí bộ nhớ có thể mà con trỏ có thể "trỏ" tới như có các giá trị có thể cho chính con trỏ. Điều này tương tự như cách mà IPv4 giới hạn phạm vi địa chỉ internet có thể, nhưng khônggiới hạn số lượng dữ liệu có thể có trong một trang web cụ thể. Tuy nhiên, kích thước con trỏ không giới hạn kích thước của dữ liệu mà con trỏ có thể trỏ tới. (Để biết ví dụ về sơ đồ cho phép kích thước dữ liệu vượt quá phạm vi con trỏ, hãy kiểm tra cấu trúc con trỏ inode của Linux . Lưu ý rằng đây là cách sử dụng hơi khác của từ "con trỏ" so với thông thường, vì con trỏ thường chỉ con trỏ trong bộ nhớ truy cập ngẫu nhiên, không phải dung lượng ổ cứng.)
    • Tương tự không tính toán: hmmmm .... cái này hơi khó. Có lẽ hệ thống thập phân Dewey để lập chỉ mục tài liệu thư viện là một chút tương tự? Hoặc bất kỳ hệ thống lập chỉ mục, thực sự.
    • Xem câu trả lời của SiteNook .
    • Xin lưu ý rằng lời giải thích của tôi về con trỏ ở trên có một số chi tiết tinh tế và được cho là không hoàn toàn chính xác. Tuy nhiên, trong các ngôn ngữ lập trình trong đó các lập trình viên làm việc trực tiếp với con trỏ, chế độ tinh thần mà tôi đã vẽ thường đủ cho các mục đích thực tế.
  • Các số mà máy tính "có thể hiển thị" không bị giới hạn (vì mục đích thực tế) bị giới hạn bởi phần cứng hoặc hệ điều hành của máy tính; chúng được đối xử như bất kỳ văn bản nào khác.

Lưu ý rằng đây không phải là một danh sách giải thích toàn diện cho cụm từ "32 bit."

Tín dụng bổ sung: để thực sự thấy sự khác biệt triết học giữa các con số và khối nguyên thủy của bộ nhớ máy tính, hãy đọc một chút về máy Turing .


Tôi nghĩ rằng tài liệu tham khảo về IPv4 là chỉ ra rằng số lượng địa chỉ IPv4 bị giới hạn hiệu quả ở độ dài của số nguyên 32 bit đã ký, trong khi IPv6 sử dụng 128 bit và do đó có thể có nhiều đơn hàng có địa chỉ lớn hơn.
Clonkex

@Clonkex Có thể, mặc dù đó chắc chắn không phải là câu hỏi được đặt ra.
Kyle Strand

5

Nếu bạn viết 1000000000000 chẳng hạn trong máy tính, máy tính sẽ tính nó dưới dạng số thực có dấu thập phân . Giới hạn cho 32 bit bạn đã đề cập chạm nhiều hơn vào tất cả các số loại Số nguyên mà không có dấu thập phân. Các kiểu dữ liệu khác nhau sử dụng các phương thức khác nhau để vào bit / byte.

Số loại số nguyên : Bảng này có thể giúp bạn bắt được điểm ( http://msdn.microsoft.com/en-us/l Library / 96az74e.aspx ). Điều này chạm vào giới hạn cho C ++. Ví dụ: số loại Int64 có giới hạn từ -9223372036854775808 đến 9223372036854775807.

Số loại thực : Số loại thực chứa giá trị với dấu phẩy độngsố mũ và bạn có thể nhập số lớn hơn nhiều, nhưng với độ chính xác / độ chính xác hạn chế. ( Http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Ví dụ LDBL (lớn gấp đôi) trong C ++ có mũ tối đa 308, vì vậy có thể bạn có thể nhập hoặc có như một số kết quả 9.999 x 10^308, có nghĩa là bạn sẽ về mặt lý thuyết có 308 (+1) chữ số 9nhưng chỉ có 15 chữ số quan trọng nhất sẽ được sử dụng để thể hiện nó, phần còn lại sẽ bị mất, do độ chính xác hạn chế.

Ngoài ra, có các ngôn ngữ lập trình khác nhau và chúng có thể có các triển khai giới hạn số khác nhau. Vì vậy, bạn có thể tưởng tượng rằng các ứng dụng chuyên dụng có thể xử lý các số lớn hơn (và / hoặc chính xác / chính xác hơn) so với C ++.


"Câu trả lời" này không chính xác: máy tính sử dụng biểu diễn số BCD để tránh các lỗi cắt ngắn. Số thập phân IE 0,1 không thể được biểu diễn chính xác dưới dạng số nhị phân có độ dài hữu hạn.
mùn cưa

5

Trong trường hợp bạn muốn một ví dụ thực tế về việc có bao nhiêu chương trình trên một hệ thống Linux điển hình xử lý đầu ra và xử lý số lượng lớn:

libgmp- Thư viện số học chính xác GNU là thư viện được sử dụng rộng rãi nhất cho mục đích này trên các hệ thống Linux. Một ví dụ đơn giản về nhân 2 ^ 80 với 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);

Về cơ bản, nó giống như sử dụng các toán tử + - * / bình thường, chỉ với một thư viện để ngắt các số và lưu trữ bên trong chúng dưới dạng nhiều số có kích thước từ máy (tức là 32 bit). Ngoài ra còn có các hàm loại scanf () để xử lý chuyển đổi văn bản đầu vào thành các kiểu số nguyên.

Cấu trúc của mpz_tgiống hệt như ví dụ của Scott Chamberlain khi đếm đến 6 bằng hai tay. Về cơ bản, đây là một mảng các loại có kích thước từ máy mp_limb_tvà khi một số quá lớn để vừa với một từ máy, thì GMP sử dụng nhiều mp_limb_tđể lưu trữ các phần cao / thấp của số.


5

Trong tâm trí bạn chỉ biết 10 chữ số khác nhau. 0 đến 9. Bên trong não của bạn, điều này chắc chắn được mã hóa khác với trong máy tính.

Một máy tính sử dụng các bit để mã hóa số, nhưng điều đó không quan trọng. Đó chỉ là cách các kỹ sư chọn để mã hóa công cụ, nhưng bạn nên bỏ qua điều đó. Bạn có thể nghĩ về nó như một máy tính 32 bit có một đại diện duy nhất với hơn 4 tỷ giá trị khác nhau, trong khi con người chúng ta có một đại diện duy nhất cho 10 giá trị khác nhau.

Bất cứ khi nào chúng tôi phải hiểu một số lượng lớn hơn, chúng tôi sử dụng một hệ thống. Số ngoài cùng bên trái là quan trọng nhất. Nó quan trọng hơn 10 lần so với tiếp theo.

Một máy tính có thể phân biệt giữa bốn tỷ giá trị khác nhau, tương tự sẽ phải tạo giá trị ngoài cùng bên trái, trong một tập hợp các giá trị, quan trọng gấp bốn tỷ lần so với giá trị tiếp theo trong tập hợp đó. Thật ra một cái máy tính chẳng quan tâm gì cả. Nó không gán "tầm quan trọng" cho các con số. Các lập trình viên phải tạo mã đặc biệt để chăm sóc điều đó.

Bất cứ khi nào một giá trị trở nên lớn hơn số lượng các ký hiệu duy nhất, 9 trong tâm trí con người, bạn thêm một giá trị vào số bên trái.

3+3=6

Trong trường hợp này, số vẫn nằm trong một "khe" duy nhất

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

Vì vậy, con người luôn đối phó với vấn đề không có đủ các biểu tượng độc đáo. Trừ khi máy tính có một hệ thống để giải quyết vấn đề này, nó chỉ đơn giản là viết 0, mà quên rằng có thêm một số. May mắn thay, máy tính có một "cờ tràn" được nêu ra trong trường hợp này.

987+321 is more difficult.

Bạn có thể đã học một phương pháp ở trường. Một thuật toán. Thuật toán khá đơn giản. Bắt đầu bằng cách thêm hai biểu tượng ngoài cùng bên trái.

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

Sau đó, bạn di chuyển đến vị trí tiếp theo và thực hiện bổ sung tương tự.

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

Vì chúng tôi đã có một tràn, có nghĩa là chúng tôi phải thêm 1 vào số tiếp theo.

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

Không có thêm số để thêm, vì vậy chúng tôi chỉ cần tạo một vị trí và chèn 1 vì cờ tràn được nâng lên.

1308

Một máy tính thực hiện chính xác theo cùng một cách, ngoại trừ nó có 2 ^ 32 hoặc thậm chí tốt hơn 2 ^ 64 biểu tượng khác nhau, thay vì chỉ có 10 như con người.

Ở mức độ phần cứng, máy tính hoạt động trên các bit đơn bằng cách sử dụng chính xác cùng một phương pháp. May mắn thay, đó là trừu tượng hóa cho các lập trình viên. Bits chỉ có hai chữ số, vì điều đó dễ thể hiện trong một đường dây điện. Hoặc là đèn sáng, hoặc là tắt.

Cuối cùng, một máy tính có thể hiển thị bất kỳ số nào dưới dạng một chuỗi ký tự đơn giản. Đó là những gì máy tính tốt nhất. Thuật toán để chuyển đổi giữa một chuỗi các ký tự và biểu diễn bên trong khá phức tạp.


Trong tôi nhớ Tôi biết 36 tuổi, nhưng tôi thường chỉ sử dụng 16 trong số họ.
Kyle Strand

'Một máy tính sử dụng các bit để mã hóa số, nhưng điều đó không quan trọng.' Trong ngữ cảnh người dùng hỏi về các từ 32 bit và cách chúng được sử dụng để lưu trữ các số lớn hơn 2 ^ 32-1 là rất quan trọng.
HörmannHH

Điều quan trọng là làm thế nào bạn mã hóa số trong bộ nhớ của bộ não. Bạn đã có một số lượng đại diện hữu hạn; hầu hết đã học được 10 biểu tượng khác nhau. Trong não của bạn, điều này có lẽ được thể hiện dưới dạng hàng ngàn tế bào thần kinh và khớp thần kinh. Trong một máy tính, nó được thể hiện dưới dạng điện hoặc không có điện trên đường dây điện. Từ góc độ lập trình - hoặc khi học toán, điều đó không quan trọng chút nào, ngoại trừ trong trường hợp hiếm hoi khi bạn lập trình trực tiếp cho một bộ CPU cụ thể. Anh ta hỏi khoảng 32 bit so với 64 bit, không phải bit riêng lẻ.
frodeborli

3

Bởi vì bạn không hiển thị một số (theo như máy tính có liên quan), mà là một chuỗi hoặc một chuỗi các chữ số. Chắc chắn, một số ứng dụng (như máy tính, tôi đoán vậy), liên quan đến các con số, có thể xử lý một số như vậy, tôi đoán vậy. Tôi không biết họ sử dụng thủ thuật gì ... Tôi chắc chắn một số câu trả lời khác, công phu hơn bao gồm điều đó.


0

Hầu hết nội dung của câu trả lời này ban đầu đến từ câu trả lời này (được viết trước đó rằng câu hỏi khác được đánh dấu là trùng lặp). Vì vậy, tôi thảo luận về việc sử dụng các giá trị 8 bit (mặc dù câu hỏi này hỏi về các giá trị 32 bit), nhưng điều đó không sao vì các giá trị 8 bit đơn giản hơn để hiểu về khái niệm và các khái niệm tương tự áp dụng cho các giá trị lớn hơn như số học 32 bit.

Khi bạn thêm hai số là 8 bit, số lớn nhất bạn có thể nhận được (0xFF + 0xFF = 1FE). Trong thực tế, nếu bạn nhân hai số là 8 bit, số lớn nhất bạn có thể nhận được (0xFF * 0xFF = 0xFE01) vẫn là 16 bit, gấp đôi 8 bit.

Bây giờ, bạn có thể giả sử rằng bộ xử lý x-bit chỉ có thể theo dõi các bit x. (Ví dụ: bộ xử lý 8 bit chỉ có thể theo dõi 8 bit.) Điều đó không chính xác. Bộ xử lý 8 bit nhận dữ liệu trong các khối 8 bit. (Các "khối" này thường có một thuật ngữ chính thức: "từ". Trên bộ xử lý 8 bit, các từ 8 bit được sử dụng. Trên bộ xử lý 64 bit, có thể sử dụng các từ 64 bit.)

Vì vậy, khi bạn cung cấp cho máy tính 3 byte:
Byte # 1: Lệnh MUL
Byte # 2: byte thứ tự cao (ví dụ: 0xA5)
Byte # 3: byte thứ tự thấp hơn (ví dụ: 0xCB)
Máy tính có thể tạo ra kết quả là hơn 8 bit. CPU có thể tạo ra kết quả như thế này:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Bây giờ, hãy để tôi giải thích rằng với bạn:
0x chỉ có nghĩa là các chữ số sau là thập lục phân.
Tôi sẽ thảo luận về "40" chi tiết hơn trong giây lát.
82 là một phần của thanh ghi "A", là một chuỗi gồm 8 bit.
xx và xx là một phần của hai thanh ghi khác, được đặt tên là thanh ghi "B" và thanh ghi "C". Lý do tôi không điền vào các bit đó bằng số 0 hoặc số đó là vì lệnh "THÊM" (được gửi tới CPU) có thể dẫn đến các bit đó không bị thay đổi bởi lệnh (trong khi hầu hết các bit khác tôi sử dụng trong ví dụ này có thể được thay đổi, ngoại trừ một số bit cờ).
D7 sẽ phù hợp với nhiều bit hơn, được gọi là thanh ghi "D".
Một thanh ghi chỉ là một phần của bộ nhớ. Các thanh ghi được tích hợp vào CPU, vì vậy CPU có thể truy cập các thanh ghi mà không cần phải tương tác với bộ nhớ trên thanh RAM.

Vậy kết quả toán học của 0xA5 lần 0xCB là 0x82D7.

Bây giờ, tại sao các bit được chia thành các thanh ghi A và D thay vì các thanh ghi A và B, hoặc các thanh ghi C và D? Chà, một lần nữa, đây là một kịch bản mẫu mà tôi đang sử dụng, có nghĩa là khá giống với ngôn ngữ hội thực sự (Intel x86 16 bit, như được sử dụng bởi Intel 8080 và 8088 và nhiều CPU mới hơn). Có thể có một số quy tắc phổ biến, chẳng hạn như thanh ghi "C" thường được sử dụng làm chỉ mục cho các hoạt động đếm (điển hình cho các vòng lặp) và thanh ghi "B" được sử dụng để theo dõi các offset giúp chỉ định vị trí bộ nhớ. Vì vậy, "A" và "D" có thể phổ biến hơn đối với một số hàm số học phổ biến.

Mỗi hướng dẫn CPU nên có một số tài liệu, được sử dụng bởi những người lập trình trong hội. Tài liệu đó nên chỉ định những thanh ghi nào được sử dụng bởi mỗi hướng dẫn. (Vì vậy, sự lựa chọn về việc sử dụng các thanh ghi nào thường được chỉ định bởi các nhà thiết kế CPU, chứ không phải các lập trình viên ngôn ngữ hội. Mặc dù, có thể có một số linh hoạt.)

Bây giờ, quay trở lại "40" trong ví dụ trên: đó là một chuỗi các bit, thường được gọi là "thanh ghi cờ". Mỗi bit trong thanh ghi cờ có một tên. Ví dụ, có một bit "tràn" mà CPU có thể đặt nếu kết quả lớn hơn không gian có thể lưu trữ một byte kết quả. (Bit "tràn" thường có thể được gọi bằng tên viết tắt là "OF". Đó là chữ hoa o, không phải số không.) Phần mềm có thể kiểm tra giá trị của cờ này và nhận thấy "vấn đề". Làm việc với bit này thường được xử lý vô hình bằng các ngôn ngữ cấp cao hơn, vì vậy các lập trình viên mới bắt đầu thường không tìm hiểu về cách tương tác với các cờ CPU. Tuy nhiên, các lập trình viên hội có thể thường truy cập vào một số các cờ này theo cách rất giống với các biến khác.

Ví dụ, bạn có thể có nhiều hướng dẫn THÊM. Một lệnh ADD có thể lưu 16 bit kết quả trong thanh ghi A và thanh ghi D, trong khi một lệnh khác có thể chỉ lưu 8 bit thấp trong thanh ghi A, bỏ qua thanh ghi D và chỉ định bit tràn. Sau đó, sau đó (sau khi lưu kết quả của thanh ghi A vào RAM chính), bạn có thể sử dụng một lệnh ADD khác chỉ lưu trữ 8 bit cao trong một thanh ghi (có thể là thanh ghi A.) Bạn có cần sử dụng cờ tràn không phụ thuộc vào chỉ số nhân mà bạn sử dụng.

(Thường có một cờ "underflow", trong trường hợp bạn trừ quá nhiều để phù hợp với kết quả mong muốn.)

Chỉ để cho bạn thấy mọi thứ phức tạp như thế nào:
Intel 4004 là CPU 4 bit
Intel 8008 là CPU 8 bit. Nó có các thanh ghi 8 bit có tên A, B, C và D.
Intel 8086 là CPU 16 bit. Nó có các thanh ghi 16 bit có tên AX, BX, CX và DX.
Intel 80386 là CPU 32 bit. Nó có các thanh ghi 32 bit có tên EAX, EBX, ECX và EDX.
Các CPU Intel x64 có các thanh ghi 64 bit có tên RAX, RBX, RCX và RDX. Các chip x64 có thể chạy mã 16 bit (trong một số chế độ hoạt động) và có thể diễn giải các hướng dẫn 16 bit. Khi làm như vậy, các bit tạo nên thanh ghi AX là một nửa số bit tạo nên thanh ghi EAX, là một nửa số bit tạo nên thanh ghi RAX. Vì vậy, bất cứ khi nào bạn thay đổi giá trị của AX, bạn cũng thay đổi EAX và RAX, bởi vì các bit được sử dụng bởi AX là một phần của các bit được sử dụng bởi RAX. (Nếu bạn thay đổi EAX theo giá trị là bội số của 65,536, thì 16 bit thấp không thay đổi để AX sẽ không thay đổi. Nếu bạn thay đổi EAX theo giá trị không phải là bội số của 65.536, thì điều đó cũng sẽ ảnh hưởng đến AX .)

Có nhiều cờ và đăng ký hơn chỉ những cái mà tôi đã đề cập. Tôi chỉ đơn giản chọn một số thường được sử dụng để cung cấp một ví dụ khái niệm đơn giản.

Bây giờ, nếu bạn đang sử dụng CPU 8 bit, khi bạn ghi vào bộ nhớ, bạn có thể thấy một số hạn chế về việc có thể tham chiếu địa chỉ 8 bit, không phải địa chỉ 4 bit hoặc 16 bit. Các chi tiết sẽ thay đổi dựa trên CPU, nhưng nếu bạn có những hạn chế như vậy, thì CPU có thể xử lý các từ 8 bit, đó là lý do tại sao CPU thường được gọi là "CPU 8 bit".


Tôi cảm thấy như những mảnh của câu trả lời của tôi lặp lại một số câu trả lời khác cho câu hỏi này. Tuy nhiên, điều này đã không được chú ý khi lần đầu tiên tôi viết nội dung kể từ khi tôi viết nó cho một câu hỏi khác. Ngoài ra, trong khi tôi đánh giá cao câu trả lời của Animism bao gồm một số mã bằng ngôn ngữ C, tôi cảm thấy nội dung của mình cung cấp một số chi tiết về cách thức hoạt động của hội, gần với thiết kế / hành động thực tế của CPU. Vì vậy, câu trả lời của tôi không cố gắng trở thành câu trả lời vượt trội "tốt hơn" tất cả những câu hỏi khác, mà chỉ là bổ sung; thêm một góc nhìn khác với một cái nhìn sâu sắc bổ sung
TẤT CẢ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.