29 votos

¿Cómo distingue una computadora '\ 0' (carácter nulo) de "unsigned int = 0"?

Si en una situación dada, tiene una serie de caracteres (que terminan, por supuesto, con el carácter nulo) y justo después de eso, en la siguiente posición inmediata en la memoria, desea almacenar 0 como un int sin signo, ¿Cómo diferencia la computadora entre estos dos?

86voto

Jamie Hanrahan Puntos 8474

No.

El terminador de cadena es un byte que contiene todos los bits 0.

El unsigned int es de dos o cuatro bytes (dependiendo del entorno), cada uno con todos los bits 0.

Los dos elementos se almacenan en diferentes direcciones. Su código compilado realiza las operaciones adecuadas para las cadenas en la antigua ubicación, y las operaciones adecuadas para números binarios sin signo en el último. (A menos que haya un error en su código, o algunos peligrosamente inteligente de código!)

Pero todos estos bytes tienen el mismo aspecto que el de la CPU. Los datos en la memoria no tiene ningún tipo de asociado con él. Eso es una abstracción que sólo existe en el código fuente y significa algo sólo para el compilador.

Editar añadido: Como un ejemplo: es perfectamente posible, incluso comunes, para realizar aritmética de los bytes que componen una cadena. Si usted tiene una cadena de 8 bits de los caracteres ASCII, puede convertir las letras en la cadena de caracteres entre mayúsculas y minúsculas al sumar o restar 32 (decimal). O si estás traduciendo a otro personaje código que puede utilizar sus valores como índices en una matriz cuyos elementos proporcionar el equivalente de bits de codificación en el otro código.

A la CPU los caracteres son en realidad extra-corto enteros. Para nosotros los humanos, de sus valores pasan a ser asociados con caracteres legibles, pero el CPU no tiene idea de eso. Asimismo, no se sabe nada acerca de la "C" convenio de "byte nulo extremos de una cadena", o bien (y como muchos han observado en otras respuestas y comentarios, hay entornos de programación en el que dicho convenio no se usa en absoluto).

Para estar seguro, hay algunas instrucciones x86/x64 que tienden a ser usado un montón de cuerdas - el prefijo REP, por ejemplo -, pero usted puede utilizar en un array de enteros, si consiguen el resultado deseado.

5voto

DurkenSA Puntos 19

En resumen no hay diferencia (salvo que un int es de 2 o 4 bytes de ancho y un char solo 1).

La cosa es que todas las bibliotecas usar el terminador nulo técnica o almacenar la longitud de una cadena. Y en ambos casos el programa/equipo sabe que llegó a la final de una cadena cuando se lee un carácter nulo o ha leído tantos caracteres como el tamaño indica.

Problemas con esto se inicia cuando el terminador nulo falta o la longitud es de mal, como a continuación se inicia el programa de lectura de la memoria que no se le supone.

2voto

No hay ninguna diferencia. Código máquina (ensamblador) no tiene tipos de variables, en lugar del tipo de datos se determina por medio de la instrucción.

Un mejor ejemplo sería int y float, si tiene 4 bytes en la memoria, que no hay información de si se trata de una int o float (o algo completamente distinto), sin embargo hay 2 diferentes instrucciones para el entero de adición y flotar, así que si el entero, además de la instrucción se usa en los datos, entonces es un número entero, y viceversa.

Mismo con las cadenas, si tienes el código que, dicen, se ve en una dirección y los recuentos de bytes hasta que se llega a un \0 bytes, usted puede pensar en él como una función de la computación en la longitud de la cadena.

De la programación de cursos como éste sería completa locura, así que por eso hemos lenguajes de alto nivel que compilar a código máquina y casi nadie de los programas en ensamblador directamente.

2voto

Klaws Puntos 191

El científico sola palabra de respuesta sería: los metadatos.

Los metadatos le dice a la computadora si algunos de los datos en un lugar determinado es un entero, una cadena, el código de programa o lo que sea. Estos metadatos pueden ser parte del Código del programa (como Jamie Hanrahan mencionado) o puede ser explícitamente almacenados en algún lugar.

Las Cpu modernas a menudo puede distinguir entre regiones de memoria asignada al programa de código y de datos de las regiones (por ejemplo, el Bit NX https://en.wikipedia.org/wiki/NX_bit). Algunos exóticos de hardware también pueden distinguir entre las cadenas y números, sí. Pero en el caso habitual es que el Software se encarga de este problema, aunque implícito de metadatos (en el código) o explícita de metadatos (orientado a objetos VMs a menudo almacenan los metadatos (tipo/clase de información) como parte de los datos (objeto)).

Una de las ventajas de no distinguir entre los diferentes tipos de datos es que algunas operaciones se vuelven muy simple. El subsistema de e/S no necesariamente necesita saber si los datos que sólo lee o escribe en el disco es en realidad el código del programa, legible por humanos del texto o números. Todo es cuestión de bits que consigue transportados a través de la máquina. Deje que el programa de código de acuerdo con la fantasía de escribir temas.

0voto

carlos prado Puntos 1

No. Se hace!

O el compilador/intérprete.

Si las instrucciones dicen ordenador para añadir el 0 como un número, lo voy a hacer. Si dicen que el equipo deje de imprimir los datos después de llegar a la 0, como un '\0' char, lo voy a hacer.

Las lenguas tienen mecanismos para garantizar cómo el tratamiento de los datos. En C las variables tienen un tipo, como int, float y char, y el compilador generar instrucciones correctas para cada tipo de datos. Pero C le permite fundición de datos de una variable a otra variable de tipo diferente, incluso un puntero puede ser utilizado como un número. Al equipo que todos los bits como cualquier otro.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: