2009-04-01 30 views
5

Gần đây tôi đã bị nhầm lẫn bởi this question. Có lẽ vì tôi không đọc thông số ngôn ngữ (đó là lỗi của tôi, tôi biết).Trình biên dịch và số âm biểu diễn

Chuẩn C99 không cho biết trình biên dịch số âm nào nên được trình biên dịch sử dụng. Tôi luôn nghĩ rằng cách duy nhất để lưu số âm là bổ sung của hai (trong hầu hết các trường hợp).

Vì vậy, đây là câu hỏi của tôi: bạn có biết bất kỳ trình biên dịch hiện tại nào thực hiện theo phần bổ sung hoặc đại diện đại diện mặc định của một người không? Chúng ta có thể thay đổi biểu diễn mặc định với một số cờ biên dịch không?

Cách đơn giản nhất để xác định đại diện nào được sử dụng?

Còn tiêu chuẩn C++ thì sao?

+0

tôi đoán bạn có thể xác định thực hiện được sử dụng bằng cách kiểm tra nhị phân của một giá trị ký hợp đồng với đại diện của mình, tương tự như cách kiểm tra endianness là làm xong. điều này có thể có thể được thực hiện trong #define và được đánh giá tại thời gian biên dịch. – slipperyseal

+0

ý tôi là, nếu bạn chưa giải quyết vấn đề này trong 6 năm qua. : o – slipperyseal

+0

[Là một bổ sung cho một vấn đề thực tế, hoặc chỉ là một vấn đề lịch sử?] (https://stackoverflow.com/q/161797/995714) –

Trả lời

5

Tôi nghĩ rằng đó không phải là quá nhiều câu hỏi về cách trình bày trình biên dịch sử dụng, mà đúng hơn là những gì mà máy bên dưới sử dụng. Trình biên dịch sẽ rất ngu ngốc để chọn một đại diện không được hỗ trợ bởi máy mục tiêu, vì điều đó sẽ giới thiệu vô số chi phí không có lợi ích.

Một số trường kiểm tra trong bộ giao thức IP sử dụng một phần bổ sung, vì vậy có lẽ dành riêng cho "bộ tăng tốc mạng" - loại CPU: s thực hiện nó.

+0

Có bất kỳ trình biên dịch C nào cho CPU kiểu "tăng tốc mạng"? – klew

+0

@ klew: Không phải là tôi có thể tìm thấy sau một vài phút dữ dội của Googling, nhưng điều đó không chứng minh được nhiều. :) – unwind

1

Trong khi twos-complement đại diện là phổ biến nhất, nó không phải là duy nhất (see some). Các ủy ban tiêu chuẩn hóa C và C++ không muốn yêu cầu các máy không bổ sung-twos để mô phỏng một đại diện không phải là bản địa. Vì vậy, cả C không phải C++ đều yêu cầu định dạng số nguyên âm cụ thể.

Điều này dẫn đến hành vi không xác định của hoạt động bitwise trên các loại đã ký.

+0

Có, nhưng đó không phải là những gì tôi hỏi. Bạn có biết bất kỳ trình biên dịch C theo mặc định sẽ sử dụng complemet của hai không? – klew

+0

Những hệ thống sử dụng bổ trợ không hỗ trợ ... Trong đó, rõ ràng, bao gồm một số hộp Unisys vẫn được hỗ trợ (điều này có thể được liệt kê trong liên kết thứ hai). – Richard

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