2016-11-18 19 views
5

Tôi thấy điều này từ C Primer Plus, phiên bản thứ 6, câu hỏi xét trong Chương 3.Tại sao 0XAA là một int không dấu và không phải là int?

Câu hỏi:

Question Picture

trả lời trong Phụ lục A:

Answer Picture

Thông báo d.0XAA, câu trả lời của tôi là int hằng số, định dạng thập lục phân, Nhưng câu trả lời là unsigned int

và tôi tự hỏi tại sao

+0

Đó là cách ngôn ngữ xác định ngôn ngữ đó. Một người nào đó tại một số điểm quyết định đó là như thế nào. Bạn thực sự không thể tìm ra lý do tại sao trừ khi bạn có một cỗ máy thời gian và có thể hỏi ai đã đưa ra quyết định đó vài thập kỷ trước. – Art

+0

@Art bạn có thể vui lòng cung cấp thêm thông tin từ tiêu chuẩn C hoặc một thứ gì khác không? Tôi sẽ đánh giá cao điều đó :) –

+0

Đây là tài liệu tham khảo bạn cần http://stackoverflow.com/questions/12499592/c-hex-constant-type – HighPredator

Trả lời

5

Sách đó không chính xác. Theo C11 6.4.4.1, loại hằng số nguyên của hệ thập lục phân được xác định từ bảng này:

Suffix ... Octal or Hexadecimal Constant 

None  ... int 
       unsigned int 
       long int 
       unsigned long int 
       long long int 
       unsigned long long int 

u or U ... unsigned int 
       unsigned long int 
       unsigned long long int 

liên tục 0xAA của bạn không có hậu tố để phần trên của bảng trên là những gì được áp dụng. Có nghĩa là: trình biên dịch đầu tiên sẽ kiểm tra xem giá trị có thể phù hợp trong một số int hay không. Nếu nó không phù hợp, nó sẽ kiểm tra nếu nó sẽ phù hợp trong một unsigned int và như vậy.

Trên mọi triển khai đã biết của C, giá trị 0xAA chắc chắn sẽ khớp với một số int. Câu trả lời đúng cho câu hỏi là int.

Tuy nhiên, có hằng số là 0xAAu, phần dưới cùng của bảng được trích dẫn sẽ áp dụng và kết quả sẽ là unsigned int.

+3

Để thêm vào câu trả lời, vì tiêu chuẩn yêu cầu 'INT_MAX' ít nhất là' + 32767', tất cả các hằng số thập lục phân không có hậu tố '0x0' đến' 0x7fff' luôn là 'int'. – user694733

+0

Điều này không được liệt kê trong số các lỗi đã biết, vì vậy tôi đã gửi một lỗi cho nhà xuất bản. – Lundin

+0

Cảm ơn câu trả lời của bạn chân thành^_ ^ –

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