Nie mogę znaleźć odpowiednich części w standardzie C w pełni definiujących zachowanie operatora jednoargumentowego minus z niepodpisanymi operandami.C: jednoargumentowe zachowanie operatora minus z niepodpisanymi operandami
z 2003 C++ Standard (tak, C++, pokrywa się ze mną przez kilka linii) mówi w 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.
Standard 1999 C, jednak nie obejmuje takiego wyraźnego oświadczenia i nie jednoznacznie definiuj jednoargumentowe zachowanie, ani w 6.5.3.3c.3, ani w 6.5c4. W drugim z nich jest napisane: 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.)
, co wyklucza jednoargumentowy minus i wydaje się, że rzeczy pozostają niejasne.
This earlier question odnosi się do K & książki R ANSI C, sekcja A.7.4.5, która mówi The negative of an unsigned quantity is computed by subtracting the promoted value from the largest value of the promoted type and adding one
.
Jaki byłby standard z 1999 r. Odpowiadający powyższemu cytatowi z książki?
6.2.5c9 mówi: 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.
Czy o to chodzi? Czy jest jeszcze coś, czego mi brakuje?
Tak, jest to §6.2.5. –
Wyniki operatorów '<<' and '>>' nie zależą od reprezentacji liczb całkowitych. Są one definiowane jako mnożenie i dzielenie potęgami dwóch i są dobrze określone tylko dla nieujemnych argumentów. "<<" jest niezdefiniowane dla ujemnych operandów, a '>>' jest zdefiniowane przez implementację dla ujemnych operandów. –
"Wartość ujemna niepodpisanej ilości jest obliczana poprzez odjęcie promowanej wartości od największej wartości promowanego typu i dodanie" - wiem, że moje matematyczne kung fu jest słabe w porównaniu do potężnego Ritchiego i Stroustrupa, ale wydaje się, że biedny, a może i szalony, sposób poradzenia sobie z sytuacją, która z pewnością jest błąd programisty 99,9 ...% czasu. Dlaczego nie rzucić błędu kompilacji mówiąc, że "próbowałeś zastosować znak do typu bez znaku, ty dingus"? – CCJ