23

Estoy jugando con operadores bit a bit en JavaScript y hay algo que me parece notable.¿Por qué es (Infinity | 0) === 0?

bitwise or operator devuelve 1 como bit de salida si uno de los dos bits de entrada es 1. Al hacerlo x | 0 siempre vuelve x, porque | 0 no tiene ningún efecto:

  • (1 | 0) === 1
  • (0 | 0) === 0

Sin embargo, cuando calculé Infinity | 0, tengo 0. Esto es sorprendente en mi opinión, porque por el anterior uno debería obtener Infinity. Después de todo, (x | 0) === x.

No puedo encontrar el lugar en la especificación de ECMAscript, esto está explícitamente definido, así que me preguntaba qué implica exactamente eso (Infinity | 0) === 0. ¿Es tal vez la forma en que Infinity se almacena en la memoria? Si es así, ¿cómo puede ser que haciendo una operación | 0 haga que regrese a 0 mientras que | 0 no debería hacer nada?

+0

¿Cómo se puede calcular '(infinity | 0)'? El infinito es ... infinito, no puede ser calculado por su propia definición ...: | – Albireo

+3

@Albireo - Porque una computadora tiene que representar el infinito de alguna manera, y tiene un número limitado de bits para hacerlo. – Dylan

+1

Esto es realmente interesante, porque 'Infinity' parece ser un valor verdadero cuando lo usa en una instrucción if-else, como uno esperaría. Acabo de confirmar esto: http://jsfiddle.net/LWBVd/. Quizás tiene que ver con la representación interna de 'Infinity'. – FishBasketGordo

Respuesta

51

Los operadores bit a bit solo trabajan en enteros.
Infinity es un valor de coma flotante, no un número entero.

La especificación says que todos los operandos de operaciones bit a bit se convierten en números enteros (utilizando el ToInt32 operación) antes de realizar la operación.

El ToInt32 operation dice:

Si el número es NaN, 0, -0, + ∞ o -∞ volver 0.

2

Realización de operaciones matemáticas y otras que esperan enteros con NaN y Infinity suele ser una mala idea. ¿Cómo definir/borrar un poco de Infinity?

En realidad, las operaciones basadas en bits solo se definen para enteros, y los enteros no tienen NaN o Infinity.

+0

Estaba pensando que 'Infinity' representaría una cantidad infinita de' 1' bits uno detrás del otro. – pimvdb

+0

Eso es más como -1 que infinito (en esto es como -1 se comporta en lenguajes como python que tienen enteros de tamaño arbitrario - javascript solo tiene enteros de 32 bits.) – Random832

+0

@ Random832: Creo que estaba pensando demasiado simplistamente. Mi idea era que al igual que '1' es' 1' y '1111' es' 16', '111 ... 111' terminaría en Infinity. – pimvdb