Lý do chính khi tôi thấy đó là biểu diễn nhị phân nào nên sử dụng? bổ sung của ai? bổ sung của hai? bạn đang mong đợi các bit thực tế trong bộ nhớ hoặc đại diện số trừu tượng?
Chỉ điều kiện thứ hai có ý nghĩa khi C không yêu cầu kích thước từ hoặc đại diện số nhị phân. Vì vậy, vì nó sẽ không được các bit trong bộ nhớ, chắc chắn bạn muốn đọc số trừu tượng trong hex?
Đòi một đại diện trừu tượng là "nhị phân" có thể dẫn đến niềm tin rằng -0b1^0b1 == 0
có thể đúng hoặc -0b1 | -0b10 == -0b11
cơ quan đại diện có thể:
Trong khi chỉ có một đại diện hex ý nghĩa - - phần tóm tắt, số -0x79
có thể được thể hiện dưới dạng nhị phân dưới dạng:
-1111001
(số trừu tượng)
11111001
(bổ sung của một người)
10000111
(bổ sung hai nhân)
@ Eric đã thuyết phục tôi rằng endianness! = Trái sang phải theo thứ tự ...
vấn đề còn phức tạp hơn khi số không phù hợp với một byte. cùng một số có thể là:
-
1000000001111001
như một bổ sung cho one's lớn-endian số 16bit
-
1111111110000111
như một two's-bổ sung lớn về cuối nhỏ số 16bit
-
1000011110000000
như một của một người -hoàn thành số 16 bit ít người kết thúc
-
1000011111111111
là số 16 bit nhỏ bổ sung của hai số
Khái niệm về tính xác thực và biểu diễn nhị phân không áp dụng cho số hex vì không có cách nào chúng có thể được xem là biểu diễn bit trong bộ nhớ thực tế.
Tất cả những ví dụ giả một byte 8-bit, mà C không đảm bảo của (máy lịch sử thực sự đã có với byte 10 bit)
Tại sao không có quyết định là tốt hơn so với bất kỳ quyết định:
Rõ ràng người ta có thể tùy ý chọn một đại diện hoặc để nó được thực hiện xác định. Tuy nhiên:
- nếu bạn đang cố gắng sử dụng này để gỡ lỗi Bitwise hoạt động, (mà tôi xem như là lý do thuyết phục duy nhất để sử dụng hệ nhị phân trên hex) bạn muốn sử dụng một cái gì đó gần gũi những gì các phần cứng sử dụng, mà làm cho nó không thể tiêu chuẩn hóa, vì vậy bạn muốn thực hiện được xác định.
- Ngược lại nếu bạn đang cố gắng đọc chuỗi bit, bạn cần định dạng chuẩn, không được triển khai.
- Và bạn chắc chắn muốn printf và scanf sử dụng như nhau.
Vì vậy, có vẻ như với tôi không có phương tiện vui vẻ nào.
Tại sao in nhị phân nếu bạn có thể in hex? Về cơ bản nó giống nhau, nhưng ở mật độ 400%. Chỉ dịch, '0 = 0000',' 1 = 0001', '2 = 0010', ...,' F = 1111'. –
@KerrekSB - Chỉ vì nó không phải là khó để làm cho mình không phải là một lý do thuyết phục để loại trừ nó khỏi ngôn ngữ. Đó là một nỗi đau khi phải chuyển từ viết sang luồng để ghi vào bộ đệm chuỗi, dịch và sau đó ghi vào luồng. –
@TedHopp: Một khi có thể tranh cãi theo cách khác thì tại sao cần * *. Bạn có thể yêu cầu tất cả các loại công cụ được đưa vào (base-4? Base-64?), Nhưng cuối cùng không có câu trả lời đúng hay sai. Các nhà thiết kế có lẽ không nghĩ rằng nó là cần thiết. Tôi tưởng tượng ra rằng bất cứ ai trong kinh doanh của thao tác nhị phân sẽ đủ thông thạo hex ... –