2010-01-27 11 views

Respuesta

10

Lo siento por la primera respuesta, aquí es una explicación de los estándares de C++ :)

es la salida de ninguna manera predecible o su indefinido ??

Es predecible. Hay dos puntos que cuidar en este código: En primer lugar, la asignación de valor que el tipo unsigned char no puede sostener:

unsigned char c; 
c = 300; 

3.9.1 tipos fundamentales (Página 54)

los enteros sin signo, declararon sin firmar, deberán obedecer las leyes de la aritmética de módulo 2n, donde n es el número de bits en la representación valor de ese tamaño particular de integer.41)
...
41) Esto implica que no firmada aritmética no se desborde porque un resultado que no puede ser representado por el tipo entero sin signo resultante se reduce módulo el número que es uno mayor que el valor más grande que puede se representará mediante el tipo de entero sin signo resultante.

Básicamente:

c = 300 % (std::numeric_limits<unsigned char>::max() + 1); 

En segundo lugar, pasando %d en la cadena de formato de printf para imprimir unsigned char variable.
Este ysth lo hizo bien;) No hay un comportamiento indefinido, porque una conversión promocional de char sin signo a int ocurre en el caso de variadic arguments!

Nota: que la segunda parte de la respuesta es un reformular de lo que se ha dicho en the comments of this answer pero no es mi respuesta en un principio.

+0

"numeric_limit" es en realidad "numeric_limits" –

+1

¿Dónde puedo leer todos estos estándares de C++? –

+2

Tiene que comprar los documentos oficiales si lo desea, o simplemente vaya a http://www.open-std.org/jtc1/sc22/wg21/ y descargue el último borrador gratis: http: //www.open- std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf – AraK

4

El resultado de la asignación debe ser predecible:

3.9.1

4 Los enteros sin signo, declararon sin firmar, deberá obedecer las leyes de modulo aritmético 2 n donde n es el número de bits en la representación del valor de ese tamaño particular de entero.17)

17) Esto implica que la aritmética sin signo no se desborda porque un resultado que no se puede reprimir Ented por el tipo de entero sin signo resultante se reduce el módulo el número que es uno mayor que el valor más grande que se puede representar por el tipo de entero sin signo resultante.

Además, sizeof (char) es definido como 1, y sizeof (unsigned char) = sizeof (char), por lo que debe ver el mismo resultado independientemente de la aplicación (asumiendo que no tiene bytes con divertido tamaños diferentes a 8).

Sin embargo, la advertencia le indica que el resultado probablemente no sea el deseado (por ejemplo, ¿quizás sobreestimó el tamaño del tipo sin firmar?). Si eso es lo que pretendía, ¿por qué no escribir 300 % (1 << CHAR_BIT) (suponiendo que 300 sea de alguna manera significativo para usted)?

Cuestiones relacionadas