2011-09-17 27 views
5

Tôi không hỏi về định nghĩa mà là lý do tại sao người tạo ngôn ngữ chọn xác định mô đun với hành vi bất đối xứng trong C++. (Tôi nghĩ Java cũng vậy)Tại sao mô-đun được định nghĩa theo cách nó được viết bằng ngôn ngữ lập trình

Giả sử tôi muốn tìm số nhỏ nhất lớn hơn hoặc bằng n chia hết cho f.

Nếu n là tích cực, sau đó tôi làm:

if(n % f) 
    ans = n + f - n % f; 

Nếu n là số âm:

ans = n - n % f; 

Rõ ràng, định nghĩa này không phải là thích hợp nhất khi giao dịch với số âm và dương. Vậy tại sao nó được định nghĩa như thế này? Trong trường hợp nào nó mang lại hiệu quả?

+0

Bạn có hỏi tại sao modulo không có định nghĩa cố định cho toán hạng âm? –

+0

http://en.wikipedia.org/wiki/Modulo_operation – starblue

+0

Để làm rõ: Tôi hỏi lý do tại sao định nghĩa là không đối xứng đối với tính chẵn lẻ của toán hạng đầu tiên. –

Trả lời

1

Vì sử dụng "số học modulo 2", trong đó mỗi chữ số nhị phân được xử lý độc lập với nhau. Xem ví dụ về "phân chia" here

+0

Nhưng nó không phải là. Số học Modulo-2 được sử dụng khi tính toán CRC, chứ không phải toán tử mô đun. – EJP

1

Bạn đang nhầm lẫn. Khi n là tiêu cực, C++ cho phép kết quả của các nhà điều hành mô đun để thể là tiêu cực hay tích cực chừng nào các kết quả từ %/ phù hợp, vì vậy đối với bất kỳ trao ab, khái niệm (a/b)*b + a%b sẽ luôn mang lại a. C99 yêu cầu kết quả của a % b sẽ có cùng ký hiệu là a. Một số ngôn ngữ khác (ví dụ: Python) yêu cầu rằng dấu hiệu của a % b có cùng ký hiệu là b.

Điều này có nghĩa là cụm từ bạn đã đưa ra cho số âm n không thực sự bắt buộc để hoạt động trong C++. Khi/nếu n%f mang lại một số dương (mặc dù n là số âm), số này sẽ cho số ans nhỏ hơn n.

+0

'(a/b) * b + a% b' luôn mang lại' a' ngoại trừ nếu 'b' bằng 0, thì hành vi là không xác định. – JohnPS

+1

* "Khi n là âm, ... *" Tốt hơn, kết quả là việc thực hiện được xác định trong C++ 03 nếu cổ tức hoặc số chia là số âm. Tuy nhiên, hầu hết các trình biên dịch C++ đều tuân theo quy ước C99; điều này cho phép nhà cung cấp sử dụng cùng một máy móc cho mã C và C++. C++ 11 theo quy ước C99. Nó không còn được thực hiện nữa. –

+0

@David: Tôi cân nhắc chỉ ra rằng * hoặc * toán hạng là âm dẫn đến việc thực hiện kết quả được xác định - nhưng kể từ khi anh ta nói cụ thể về 'n' là tiêu cực, quyết định tốt hơn là chỉ thảo luận về điều đó. Theo như sự giống nhau đi, C99 là người theo dõi nhiều hơn so với các nhà lãnh đạo - tức là, họ tiêu chuẩn hóa nó bởi vì về cơ bản tất cả các phần cứng hiện đại hoạt động theo cách đó. Microsoft, một ví dụ, dường như sử dụng những gì lệnh x86 'div' tạo ra, và cho thấy không có sự quan tâm rõ ràng nào trong sự phù hợp của C99. –

Các vấn đề liên quan