Parece que no puedo encontrar las partes relevantes en el estándar C definiendo completamente el comportamiento del operador unario negativo con operandos sin signo.C: comportamiento de operador unitario negativo con operandos sin signo
El estándar C++ 2003 (sí, C++, oso conmigo durante unas pocas líneas) dice en 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.
La norma C 1999, sin embargo, no incluye una declaración tan explícita y no lo hace defina claramente el comportamiento unario ni en 6.5.3.3c1,3 ni en 6.5c4. En este último dice 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.)
, que excluye el menos unario y las cosas parecen ser vagas.
This earlier question se refiere a la K & libro R ANSI C, sección A.7.4.5 que dice The negative of an unsigned quantity is computed by subtracting the promoted value from the largest value of the promoted type and adding one
.
¿Cuál sería el estándar C de 1999 equivalente a la cita anterior del libro?
6.2.5c9 dice: 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.
es que? ¿O hay algo más que me estoy perdiendo?
Sí, es §6.2.5. –
Los resultados de los operadores '<<' and '>>' no dependen de la representación de los enteros. Se definen como multiplicación y división por potencias de dos y solo están bien definidos solo para operandos no negativos. '<<' no está definido para los operandos negativos, y '>>' está definido por la implementación para los operandos negativos. –
'El negativo de una cantidad sin firmar se calcula restando el valor promocionado del mayor valor del tipo promocionado y añadiendo uno' - Sé que mi kung fu matemático es débil en comparación con el poderoso Ritchie y Stroustrup, pero esto parece una Una forma pobre, y tal vez insensata, de manejar una situación que ciertamente es un error del programador 99.9 ...% de las veces. ¿Por qué no lanzar un error de compilación diciendo 'has intentado aplicar un signo a un tipo sin firmar, dingus'? – CCJ