Tôi dường như không thể tìm thấy các phần liên quan trong tiêu chuẩn C xác định đầy đủ hành vi của toán tử trừ đơn toán với toán hạng chưa ký.C: unary trừ hành vi của toán tử với toán hạng chưa ký
2003 chuẩn C++ (có, C++, gấu với tôi trong một vài dòng) nói trong 5.3.1c7: The negative of an unsigned quantity is computed by subtracting its value from 2^n, where n is the number of bits in the promoted operand.
Tiêu chuẩn 1999 C, tuy nhiên, không bao gồm một tuyên bố rõ ràng như vậy và không xác định rõ ràng hành vi đơn nhất không trong 6.5.3.3c1,3 cũng như trong 6.5c4. Trong sau này nó nói Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, and |, ...) ... return values that depend on the internal representations of integers, and have implementation-defined and undefined aspects for signed types.)
, trong đó không bao gồm trừ đơn và những thứ dường như vẫn còn mơ hồ.
This earlier question dùng để chỉ sách K & R ANSI C, mục A.7.4.5 có nội dung là The negative of an unsigned quantity is computed by subtracting the promoted value from the largest value of the promoted type and adding one
.
Tiêu chuẩn C năm 1999 tương đương với báo giá ở trên từ sách là gì?
6.2.5c9 nói: A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.
Có phải không? Hoặc có cái gì khác tôi đang mất tích?
Có, đó là §6.2.5. –
Kết quả của các toán tử '<<' and '>>' không phụ thuộc vào sự biểu diễn của các số nguyên. Chúng được định nghĩa là phép nhân và phép chia theo lũy thừa của hai và chỉ được định nghĩa rõ ràng cho các toán hạng không âm. '<<' là không xác định cho các toán hạng âm, và '>>' được định nghĩa thực hiện cho các toán hạng âm. –
'Âm của một số chưa ký được tính bằng cách trừ giá trị được khuyến khích từ giá trị lớn nhất của loại được quảng bá và thêm một' - Tôi biết kung fu toán học của tôi yếu so với Ritchie và Stroustrup hùng mạnh, nhưng điều này có vẻ như người nghèo, và có lẽ điên rồ, cách để xử lý một tình huống chắc chắn là lỗi lập trình viên 99,9 ...% thời gian. Tại sao không ném một lỗi biên dịch nói rằng 'bạn đã cố gắng áp dụng một dấu hiệu cho một loại unsigned, bạn dingus'? – CCJ