Đây có phải là cách toán tử + được triển khai trong C không?


79

Khi tìm hiểu các nhà khai thác như thế nào nguyên thủy như +, -, */được thực hiện trong C, tôi thấy đoạn sau đây từ một câu trả lời thú vị .

Có vẻ như chức năng này thể hiện cách +thực sự hoạt động trong nền. Tuy nhiên, nó quá khó hiểu đối với tôi. Tôi tin rằng các hoạt động như vậy được thực hiện bằng cách sử dụng các lệnh hợp ngữ được tạo bởi trình biên dịch trong một thời gian dài!

Nhà +điều hành có được triển khai như mã được đăng trên các triển khai MOST không? Điều này có tận dụng lợi thế của hai tính năng bổ sung hoặc các tính năng phụ thuộc vào triển khai khác không?


60
Tôi đoán hầu hết các triển khai sẽ sử dụng addlệnh máy gốc , mà tôi đoán tất cả CPU đều có và được triển khai dưới dạng bộ cộng phần cứng hoạt động trong một vài đồng hồ.
MikeCAT

3
Có, +nhà điều hành rất có thể tận dụng các tính năng được xác định triển khai. Chúng được gọi là "ngôn ngữ máy" và "CPU". Câu hỏi của bạn là gì`? Nếu bạn muốn biết cách các biểu thức được chuyển đổi thành mã máy, vui lòng đọc về xây dựng trình biên dịch.
quá trung thực cho trang web này

Bạn có nghĩa là mã tôi đã đăng hoàn toàn vô dụng, bởi vì +chúng được dịch sang các chỉ thị hợp ngữ chẳng hạn như addbởi trình biên dịch?
nalzok

11
Hầu hết các +thao tác sẽ được biên dịch thành một số biến thể (hoặc kết hợp) của các lệnh mã máy add. Mã của bạn phức tạp và vô dụng trong mọi tình huống thực tế, nhưng nó có thể dùng để dạy về các phép toán nhị phân.
Anders Tornblad

11
Mặc dù không phải cách C thực hiện (xem câu trả lời bên dưới), nhưng nó khá gần với cách mạch liên quan có thể thêm vào ở mức thấp nhất. Hãy thử làm việc thông qua nó trên giấy và bút cho các giá trị nhị phân nhỏ (ví dụ như 3 hoặc 4 bit byte) và xem nó hoạt động như thế nào. Bây giờ hãy tưởng tượng làm thế nào mạch điện có thể làm điều tương tự với các xung điện. Bây giờ hãy tưởng tượng làm tất cả các bit song song, thay vì một vòng lặp. Bây giờ bạn đã sẵn sàng để xây dựng một chiếc máy tính thời đại những năm 1940: D
Jon Hanna

Câu trả lời:


184

Nói một cách khái quát, đặc tả C không chỉ rõ cách thực hiện bổ sung.

Nhưng thực tế, +toán tử trên các kiểu số nguyên nhỏ hơn hoặc bằng kích thước từ của CPU của bạn sẽ được dịch trực tiếp thành lệnh cộng cho CPU và các kiểu số nguyên lớn hơn được dịch thành nhiều lệnh cộng với một số bit bổ sung để xử lý tràn.

Bên trong CPU sử dụng các mạch logic để thực hiện việc bổ sung, và không sử dụng các vòng lặp, bithifts hoặc bất kỳ thứ gì gần giống với cách hoạt động của C.


12
Câu trả lời này là tuyệt vời vì nó được trình bày với sự rõ ràng và đơn giản khác thường. Tôi không thấy nó quá khoa trương chút nào, chỉ đơn thuần là liều thuốc phù hợp cho câu hỏi.
Jeremy Anderson

5
@orlp thực sự, các mạch logic CPU có thể được biên dịch từ HDL và bạn có khả năng tạo bộ cộng bằng cách sử dụng các vòng lặp và bithifts tương tự như gợi ý của OP (nhưng chỉ mơ hồ). Các vòng lặp và bithifts đã nói sẽ mô tả cách bố trí phần cứng và cách chúng được kết nối. Sau đó, một lần nữa, trong phần cứng cấp cao nhất, ai đó có thể bỏ cuộn các vòng lặp và bithifts đã nói, hoặc thậm chí loại bỏ HDL và bố trí mạch theo cách thủ công cho thứ gì đó quan trọng về hiệu suất như một bộ cộng.
Yakk - Adam Nevraumont

5
Một mạch cộng tuyến tính thực hiện chính xác những gì mã C đó làm nhưng vòng lặp không được cuộn hoàn toàn trong phần cứng (32 lần).
usr

2
@usr không chỉ được hủy cuộn, mà mọi "bước" đều xảy ra đồng thời.
OrangeDog

4
@OrangeDog, một trình bổ sung phần cứng đơn giản sẽ có một phần mềm giống như mã C này, điều này làm hạn chế việc phân loại. Các bộ cộng hiệu suất cao có thể sử dụng mạch nhìn trước để giảm điều này.
plugwash

77

Khi bạn thêm hai bit, sau đây là kết quả: (bảng sự thật)

Vì vậy, nếu bạn thực hiện bitwise xor, bạn có thể nhận được tổng mà không cần thực hiện. Và nếu bạn làm theo bitwise và bạn có thể nhận được các bit mang theo.

Mở rộng quan sát này cho các số nhiều bit ab

Một lần b0:

Vì vậy, thuật toán tổng hợp thành:

Nếu bạn loại bỏ đệ quy và chuyển đổi nó thành một vòng lặp


Với thuật toán trên, giải thích từ mã sẽ đơn giản hơn:

Mang bit. Bít mang là 1 nếu 1 bit ở bên phải trong cả hai toán hạng là 1.

Bổ sung không mang (bỏ qua các bit mang)

Sử dụng lại x để đặt nó mang theo

Lặp lại khi có nhiều bit mang hơn


Một triển khai đệ quy (dễ hiểu hơn) sẽ là:

Có vẻ như chức năng này thể hiện cách + thực sự hoạt động trong nền

Không. Thông thường (hầu như luôn luôn) phép cộng số nguyên chuyển thành phép cộng lệnh máy. Điều này chỉ chứng minh một triển khai thay thế bằng cách sử dụng bitwise xor và và.


5
Đây là câu trả lời tốt nhất imo, tất cả những câu khác nói rằng nó thường được dịch sang một lệnh duy nhất, nhưng điều này thực hiện điều đó và cũng giải thích chức năng đã cho.
Nick Sweeting

@NickSweeting Cảm ơn. Câu hỏi có thể được giải thích theo 2 cách và tôi nghĩ câu trả lời được chấp nhận đã giải thích đúng những gì OP muốn hỏi.
Mohit Jain

25

Có vẻ như chức năng này thể hiện cách + thực sự hoạt động trong nền

Không. Điều này được dịch sang addhướng dẫn máy gốc , thực sự đang sử dụng bộ bổ sung phần cứng, trong ALU.

Nếu bạn đang tự hỏi làm thế nào để máy tính thêm, đây là một bộ cộng cơ bản.

Mọi thứ trong máy tính được thực hiện bằng cách sử dụng các cổng logic, hầu hết được làm bằng các bóng bán dẫn. Bộ cộng đầy đủ có các bộ cộng một nửa trong đó.

Để có hướng dẫn cơ bản về cổng logic và bộ cộng, hãy xem phần này . Video rất hữu ích, mặc dù dài.

Trong video đó, một bộ cộng một nửa cơ bản được hiển thị. Nếu bạn muốn có một mô tả ngắn gọn, thì đây là:

Bộ cộng một nửa là hai bit đã cho. Các kết hợp có thể có là:

  • Thêm 0 và 0 = 0
  • Thêm 1 và 0 = 1
  • Thêm 1 và 1 = 10 (nhị phân)

Vậy bây giờ bộ cộng một nửa hoạt động như thế nào? Vâng, nó được tạo thành từ ba cổng logic and, xornand. Giá trị nand cho một dòng điện dương nếu cả hai đầu vào đều âm, do đó, điều này có nghĩa là điều này giải quyết được trường hợp 0 ​​và 0. Giá trị này xorcho một đầu ra dương, một trong các đầu vào là dương và đầu kia là âm, vì vậy điều đó có nghĩa là nó giải quyết được vấn đề 1 và 0. Chỉ andcho kết quả đầu ra dương nếu cả hai đầu vào đều dương, do đó giải quyết vấn đề của 1 và 1. Vì vậy, về cơ bản, bây giờ chúng ta đã có bộ cộng nửa của mình. Nhưng chúng tôi vẫn chỉ có thể thêm bit.

Bây giờ chúng tôi tạo bộ cộng đầy đủ của chúng tôi. Một bộ cộng đầy đủ bao gồm việc gọi đi gọi lại bộ cộng nửa. Bây giờ điều này có một thực hiện. Khi chúng ta thêm 1 và 1, chúng ta nhận được giá trị mang 1. Vì vậy, những gì mà bộ cộng đầy đủ làm là, nó lấy phần mang từ bộ cộng nửa, lưu trữ nó và chuyển nó như một đối số khác cho bộ cộng nửa.

Nếu bạn bối rối làm thế nào bạn có thể vượt qua lượt mang, về cơ bản trước tiên bạn thêm các bit bằng cách sử dụng bộ cộng nửa, sau đó thêm tổng và lượt mang. Vì vậy, bây giờ bạn đã thêm thực hiện, với hai bit. Vì vậy, bạn làm điều này lặp đi lặp lại, cho đến khi hết số bit bạn phải thêm và sau đó bạn nhận được kết quả của mình.

Ngạc nhiên? Đây là cách nó thực sự xảy ra. Nó trông giống như một quá trình dài, nhưng máy tính thực hiện nó trong một phần nhỏ của nano giây, hay cụ thể hơn là trong nửa chu kỳ đồng hồ. Đôi khi nó được thực hiện ngay cả trong một chu kỳ đồng hồ duy nhất. Về cơ bản, máy tính có ALU(một phần chính của CPU), bộ nhớ, bus, v.v.

Nếu bạn muốn học phần cứng máy tính, từ cổng logic, bộ nhớ và ALU, và mô phỏng một máy tính, bạn có thể xem khóa học này, từ đó tôi đã học được tất cả những điều này: Xây dựng một máy tính hiện đại từ những nguyên tắc đầu tiên

Nó miễn phí nếu bạn không muốn có chứng chỉ điện tử. Phần hai của khóa học sẽ ra mắt vào mùa xuân năm nay


11
Một vài mili giây? Đối với một bổ sung duy nhất?
JAB

2
Phép cộng với hai giá trị đã đăng ký thường được hoàn thành trong một đồng hồ duy nhất.
Cody Grey

5
@Tamoghna Chowdhury: Hãy thử một số phần nhỏ của nano giây. Đăng ký bổ sung là IIRC một xung nhịp trên các bộ vi xử lý Intel gần đây, vì vậy với tốc độ đồng hồ là vài GHz ... Và đó là không tính việc thực thi pipelining, superscalar, v.v.
jamesqf

Bộ cộng ripple-carry này sẽ thêm quá nhiều độ trễ, vì vậy nó thậm chí không được triển khai theo cách này trong phần cứng.
pipe

Bộ cộng ripple-carry đã không được CPU sử dụng trong nhiều thập kỷ, vì nó quá chậm. Thay vào đó, họ sử dụng các bộ cộng phức tạp hơn có thể thực hiện công việc trong một chu kỳ xung nhịp đơn (hoặc thậm chí nửa chu kỳ, trong trường hợp một số ALU xung nhịp kép của Intel). (Chà, hầu hết các CPU không sử dụng nó. Các CPU nhúng cấp thấp vẫn có thể sử dụng nó cho số lượng bóng bán dẫn thấp.)
Đánh dấu

15

C sử dụng một máy trừu tượng để mô tả những gì mã C làm. Vì vậy, nó hoạt động như thế nào không được chỉ định. Có những "trình biên dịch" C thực sự biên dịch C thành một ngôn ngữ kịch bản, chẳng hạn.

Tuy nhiên, trong hầu hết các triển khai C, +giữa hai số nguyên nhỏ hơn kích thước số nguyên của máy sẽ được dịch thành một lệnh hợp ngữ (sau nhiều bước). Hướng dẫn lắp ráp sẽ được dịch thành mã máy và được nhúng vào tệp thực thi của bạn. Assembly là một ngôn ngữ được "loại bỏ một bước" khỏi mã máy, nhằm mục đích dễ đọc hơn một loạt các nhị phân đóng gói.

Mã máy đó (sau nhiều bước) sau đó được giải thích bởi nền tảng phần cứng đích, nơi nó được giải mã bởi bộ giải mã lệnh trên CPU. Bộ giải mã lệnh này nhận lệnh và chuyển nó thành các tín hiệu để gửi dọc theo "đường điều khiển". Các tín hiệu này định tuyến dữ liệu từ các thanh ghi và bộ nhớ thông qua CPU, nơi các giá trị được cộng lại với nhau thường trong một đơn vị logic số học.

Đơn vị logic số học có thể có các bộ cộng và số nhân riêng biệt hoặc có thể trộn chúng với nhau.

Đơn vị logic số học có một loạt các bóng bán dẫn thực hiện phép toán cộng, sau đó tạo ra đầu ra. Đầu ra cho biết được định tuyến thông qua các tín hiệu được tạo ra từ bộ giải mã lệnh và được lưu trữ trong bộ nhớ hoặc thanh ghi.

Cách bố trí các bóng bán dẫn nói trên trong cả khối logic số học và bộ giải mã lệnh (cũng như các bộ phận mà tôi đã đề cập) được khắc vào chip tại nhà máy. Mô hình khắc thường được tạo ra bằng cách biên dịch một ngôn ngữ mô tả phần cứng, ngôn ngữ này lấy một phần trừu tượng về những gì được kết nối với những gì và cách chúng hoạt động và tạo ra các bóng bán dẫn và các đường kết nối.

Ngôn ngữ mô tả phần cứng có thể chứa các thay đổi và vòng lặp không mô tả mọi thứ diễn ra theo thời gian (như cái khác) mà là trong không gian - nó mô tả các kết nối giữa các phần khác nhau của phần cứng. Mã đã nói có thể trông rất mơ hồ giống như mã bạn đã đăng ở trên.

Các lớp trên phủ bóng trên nhiều bộ phận và nhiều lớp và chứa những điểm không chính xác. Đây là cả sự kém cỏi của tôi (tôi đã viết cả phần cứng và trình biên dịch, nhưng tôi không phải là một chuyên gia về cả hai lĩnh vực này) và bởi vì chi tiết đầy đủ sẽ mất một hoặc hai sự nghiệp chứ không phải là một bài SO.

Đây là một bài đăng SO về một bộ cộng 8-bit. Đây là một bài đăng không SO, nơi bạn sẽ lưu ý một số trình bổ sung chỉ sử dụng operator+trong HDL! (HDL tự hiểu +và tạo mã bộ cộng cấp thấp hơn cho bạn).


14

Hầu như bất kỳ bộ xử lý hiện đại nào có thể chạy mã C đã biên dịch sẽ có hỗ trợ nội trang để thêm số nguyên. Mã bạn đã đăng là một cách thông minh để thực hiện phép cộng số nguyên mà không cần thực hiện mã lệnh thêm số nguyên, nhưng nó không phải là cách phép cộng số nguyên thường được thực hiện. Trên thực tế, liên kết hàm có thể sử dụng một số hình thức cộng số nguyên để điều chỉnh con trỏ ngăn xếp.

Mã bạn đã đăng dựa trên quan sát rằng khi thêm x và y, bạn có thể phân tách nó thành các bit chúng có chung và các bit duy nhất cho một trong số x hoặc y.

Biểu thức x & y(bitwise AND) cung cấp các bit chung cho x và y. Biểu thức x ^ y(OR loại trừ theo từng bit) cho các bit là duy nhất của một trong x hoặc y.

Tổng x + ycó thể được viết lại bằng tổng của hai lần các bit mà chúng có chung (vì cả x và y đều đóng góp các bit đó) cộng với các bit là duy nhất của x hoặc y.

(x & y) << 1 là gấp đôi số bit mà chúng có điểm chung (dịch trái của 1 nhân với hai).

x ^ y là các bit duy nhất của một trong số x hoặc y.

Vì vậy, nếu chúng ta thay x bằng giá trị đầu tiên và y bằng giá trị thứ hai, tổng sẽ không đổi. Bạn có thể coi giá trị đầu tiên là giá trị mang của các phép cộng theo bit và giá trị thứ hai là bit bậc thấp của các phép cộng theo bit.

Quá trình này tiếp tục cho đến khi x bằng 0, lúc này y giữ tổng.


14

Mã mà bạn tìm thấy cố gắng giải thích cách phần cứng máy tính rất sơ khai có thể triển khai lệnh "thêm". Tôi nói "sức mạnh" vì tôi có thể đảm bảo rằng này phương pháp không được sử dụng bởi bất kỳ CPU, và tôi sẽ giải thích lý do tại sao.

Trong cuộc sống bình thường, bạn sử dụng số thập phân và bạn đã học cách cộng chúng: Để cộng hai số, bạn thêm hai chữ số thấp nhất. Nếu kết quả nhỏ hơn 10, bạn ghi kết quả và chuyển sang vị trí chữ số tiếp theo. Nếu kết quả từ 10 trở lên, bạn ghi kết quả trừ đi 10, chuyển sang chữ số tiếp theo, mua về bạn nhớ cộng thêm 1 nữa. Ví dụ: 23 + 37, bạn thêm 3 + 7 = 10, bạn viết bớt 0 và nhớ thêm 1 nữa cho vị trí tiếp theo. Ở vị trí 10s, bạn thêm (2 + 3) + 1 = 6 và viết nó ra. Kết quả là 60.

Bạn có thể làm điều tương tự với số nhị phân. Sự khác biệt là các chữ số duy nhất là 0 và 1, do đó, các tổng duy nhất có thể là 0, 1, 2. Đối với số 32 bit, bạn sẽ xử lý vị trí một chữ số sau chữ số kia. Và đó là cách phần cứng máy tính thực sự thô sơ sẽ làm điều đó.

Mã này hoạt động khác. Bạn biết tổng của hai chữ số nhị phân là 2 nếu cả hai chữ số đều là 1. Vì vậy, nếu cả hai chữ số đều là 1 thì bạn sẽ thêm 1 nữa ở vị trí nhị phân tiếp theo và viết ra 0. Đó là cách tính t thực hiện: Nó tìm tất cả các vị trí trong đó cả hai chữ số nhị phân là 1 (đó là &) và chuyển chúng sang vị trí chữ số tiếp theo (<< 1). Sau đó, nó thực hiện phép cộng: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 là 2, nhưng chúng ta viết ra 0. Đó là những gì toán tử loại trừ hoặc toán tử thực hiện.

Nhưng tất cả số 1 mà bạn phải xử lý ở vị trí chữ số tiếp theo vẫn chưa được xử lý. Chúng vẫn cần được thêm vào. Đó là lý do tại sao đoạn mã thực hiện một vòng lặp: Trong lần lặp tiếp theo, tất cả các số 1 thừa được thêm vào.

Tại sao không có bộ xử lý nào làm theo cách đó? Bởi vì nó là một vòng lặp và bộ xử lý không thích các vòng lặp, và nó chậm. Nó chậm, vì trong trường hợp xấu nhất, cần 32 lần lặp: Nếu bạn thêm 1 vào số 0xffffffff (32 bit 1), thì lần lặp đầu tiên xóa bit 0 của y và đặt x thành 2. Lần lặp thứ hai xóa bit 1 của y và đặt x thành 4. Và cứ thế. Cần 32 lần lặp để có kết quả. Tuy nhiên, mỗi lần lặp phải xử lý tất cả các bit của x và y, điều này tốn rất nhiều phần cứng.

Một bộ xử lý nguyên thủy sẽ thực hiện mọi việc nhanh chóng như cách bạn thực hiện số học thập phân, từ vị trí thấp nhất đến cao nhất. Nó cũng cần 32 bước, nhưng mỗi bước xử lý chỉ hai bit cộng với một giá trị từ vị trí bit trước đó, vì vậy nó dễ thực hiện hơn nhiều. Và ngay cả trong một máy tính nguyên thủy, người ta có thể đủ khả năng làm điều này mà không cần phải thực hiện các vòng lặp.

Một CPU hiện đại, nhanh và phức tạp sẽ sử dụng "bộ cộng tổng có điều kiện". Đặc biệt nếu số lượng bit nhiều, ví dụ bộ cộng 64 bit, nó tiết kiệm rất nhiều thời gian.

Bộ cộng 64 bit bao gồm hai phần: Đầu tiên, bộ cộng 32 bit cho 32 bit thấp nhất. Bộ cộng 32 bit đó tạo ra một tổng và một "mang" (một chỉ báo rằng số 1 phải được thêm vào vị trí bit tiếp theo). Thứ hai, hai bộ cộng 32 bit cho 32 bit cao hơn: Một bộ thêm x + y, bộ còn lại thêm x + y + 1. Cả ba bộ cộng hoạt động song song. Sau đó, khi bộ cộng đầu tiên tạo ra giá trị mang nó, CPU chỉ cần chọn một trong hai kết quả x + y hoặc x + y + 1 là kết quả chính xác và bạn có kết quả hoàn chỉnh. Vì vậy, bộ cộng 64 bit chỉ mất một chút thời gian dài hơn một chút so với bộ cộng 32 bit, không dài gấp đôi.

Các phần bộ cộng 32 bit lại được triển khai dưới dạng bộ cộng tổng có điều kiện, sử dụng nhiều bộ cộng 16 bit và bộ cộng 16 bit là bộ cộng tổng có điều kiện, v.v.


13

Câu hỏi của tôi là: Toán tử + có được triển khai như mã được đăng trên các triển khai MOST không?

Hãy trả lời câu hỏi thực tế. Tất cả các toán tử được trình biên dịch thực hiện dưới dạng một số cấu trúc dữ liệu nội bộ cuối cùng được dịch thành mã sau một số biến đổi. Bạn không thể nói mã nào sẽ được tạo bởi một phép bổ sung vì hầu như không có trình biên dịch trong thế giới thực nào tạo mã cho các câu lệnh riêng lẻ.

Trình biên dịch có thể tự do tạo bất kỳ mã nào miễn là nó hoạt động như thể các hoạt động thực tế được thực hiện theo tiêu chuẩn. Nhưng những gì thực sự xảy ra có thể là một cái gì đó hoàn toàn khác.

Một ví dụ đơn giản:

Không cần tạo bất kỳ hướng dẫn bổ sung nào ở đây. Hoàn toàn hợp pháp khi trình biên dịch dịch điều này thành:

Hoặc có thể trình biên dịch nhận thấy rằng bạn gọi hàm foomột vài lần liên tiếp và nó là một số học đơn giản và nó sẽ tạo ra các hướng dẫn vectơ cho nó. Hoặc kết quả của phép cộng được sử dụng để lập chỉ mục mảng sau này và lealệnh sẽ được sử dụng.

Bạn chỉ đơn giản là không thể nói về cách một toán tử được thực hiện bởi vì nó hầu như không bao giờ được sử dụng một mình.


11

Trong trường hợp phân tích mã giúp ích cho bất kỳ ai khác, hãy lấy ví dụ x=2, y=6:


xkhông phải là 0, vì vậy hãy bắt đầu thêm vào y:

x & y = 2 bởi vì

2 <<1 = 4<< 1dịch chuyển tất cả các bit sang trái:

Nói tóm lại, giấu kết quả đó, 4trong tvới

Bây giờ áp dụng bitwise XOR y^=x :

Vì vậy x=2, y=4. Cuối cùng, tính tổng t+ybằng cách đặt lại x=tvà quay lại phần đầu của whilevòng lặp:

Khi t=0(hoặc ở đầu vòng lặp, x=0), kết thúc bằng


1
Đã có một lời giải thích tốt về lý do tại sao chúng tôi lưu trữ bit mang theo, vì vậy tôi đăng câu trả lời này để hiển thị cách mã hoạt động.
user1717828

11

Thật thú vị, trên bộ xử lý Atmega328P, với trình biên dịch avr-g ++, đoạn mã sau thực hiện cộng một bằng cách trừ đi -1:

volatile char x;
int main ()
  {
  x = x + 1;  
  }

Mã đã tạo:

00000090 <main>:
volatile char x;
int main ()
  {
  x = x + 1;  
  90:   80 91 00 01     lds r24, 0x0100
  94:   8f 5f           subi    r24, 0xFF   ; 255
  96:   80 93 00 01     sts 0x0100, r24
  }
  9a:   80 e0           ldi r24, 0x00   ; 0
  9c:   90 e0           ldi r25, 0x00   ; 0
  9e:   08 95           ret

Đặc biệt lưu ý rằng việc thêm được thực hiện bởi subilệnh (trừ hằng số khỏi thanh ghi) trong đó 0xFF có hiệu quả là -1 trong trường hợp này.

Một điều đáng quan tâm nữa là bộ xử lý cụ thể này không có addihướng dẫn, điều này ngụ ý rằng các nhà thiết kế nghĩ rằng việc thực hiện phép trừ phần bổ sung sẽ được xử lý đầy đủ bởi người viết trình biên dịch.

Điều này có tận dụng lợi thế của hai tính năng bổ sung hoặc các tính năng phụ thuộc vào triển khai khác không?

Có thể công bằng mà nói rằng những người viết trình biên dịch sẽ cố gắng thực hiện hiệu ứng mong muốn (thêm số này vào số khác) theo cách hiệu quả nhất có thể cho kiến ​​trúc đặc biệt đó. Nếu điều đó yêu cầu trừ phần bổ sung, thì hãy để nó.

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.