return-value - C++:¿Cómo puedo devolver un valor negativo en main.cpp?




negative-number (4)

Unix y Linux están limitados a códigos de retorno de 8 bits, -2 es 0xfe. ¿Cuál será tu shell que será 254 cuando hagas echo $?

Se espera que usted dé un código de retorno entre 0 y 255.

http://en.wikipedia.org/wiki/Exit_status

en los estados de salida compatibles con POSIX están restringidos a los valores 0-255, el rango de un entero de 8 bits sin signo.

Como una tarea en la escuela, tenemos que escribir un programa en C ++ y devolver diferentes códigos de error en la página main .

El problema es que tenemos que devolver -2 si ocurre un error específico pero no tengo idea de cómo devolver un valor negativo.

Por ejemplo:

int main()
{ 
    int a = -2; 
    return a;
}

En Windows, esto me da un valor de retorno como: 42232684 y en Linux hay: 253

¿Por qué -2 no está permitido?

¿Y cómo puedo conseguir -2 ?


El problema es que lo que se devuelve al sistema operativo es interpretado por el shell del sistema operativo como a TI le gusta, no como le gusta a su programa.

la función principal devuelve un int, y el return -2 es justo lo que su programa tiene que hacer.

253 es -2 en 2s complementa en 8 bits.

El problema -aquí- es una discrepancia entre las especificaciones de C ++ ( int main() ) y la forma en que el shell lo usa. Pero no depende del programa.

La tarea en sí es una trampa.


Del estándar C ++ 11 18.5 / 8:

Si el estado es cero o EXIT_SUCCESS, se devuelve una forma definida por la implementación de la terminación exitosa del estado. Si el estado es EXIT_FAILURE, se devuelve una forma definida por la implementación de la terminación incorrecta del estado. De lo contrario, el estado devuelto está definido por la implementación.

Por lo tanto, es completamente compatible que obtenga diferentes resultados para diferentes plataformas y / o compiladores.


Para idiomas que no especifican un modelo de memoria, está escribiendo código para el idioma y el modelo de memoria especificado por la arquitectura del procesador. El procesador puede optar por reordenar los accesos de memoria para el rendimiento. Por lo tanto, si su programa tiene carreras de datos (una carrera de datos es cuando es posible que múltiples núcleos / hipercrocesos accedan a la misma memoria simultáneamente), entonces su programa no es multiplataforma debido a su dependencia del modelo de memoria del procesador. Puede consultar los manuales del software Intel o AMD para averiguar cómo los procesadores pueden reordenar los accesos a la memoria.

Muy importante, los bloqueos (y la semántica de concurrencia con el bloqueo) se implementan normalmente de forma multiplataforma ... Entonces, si está utilizando bloqueos estándar en un programa multiproceso sin carreras de datos, entonces no tiene que preocuparse por los modelos de memoria multiplataforma .

Curiosamente, los compiladores de Microsoft para C ++ tienen semántica de adquisición / lanzamiento para volatile, que es una extensión de C ++ para hacer frente a la falta de un modelo de memoria en C ++ http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx . Sin embargo, dado que Windows solo se ejecuta en x86 / x64, eso no significa mucho (los modelos de memoria de Intel y AMD hacen que sea fácil y eficiente implementar semántica de adquisición / lanzamiento en un idioma).





c++ return-value negative-number