El problema que planteas es muy interesante.
Para empezar, los eventos keypress, keydown y keyup tienen implementaciones distintas en función del navegador y devuelven valores distintos.
Keydown y keyup devuelven el código de la tecla pulsada (keycode) mientras que keypress devuelve el carácter ASCII correspondiente con la pulsación (charcode).
Por ejemplo, si pulsas A y a tendrás el mismo keycode (tecla 'a') pero diferente ASCII.
En tu caso, el "-", tiene un único código ASCII (el 45) pero tiene varios keycodes (por ejemplo, en mi teclado hay dos teclas en el teclado que insertan dicho carácter, el guión de al lado del shift y el "menos" en el teclado numérico pero puedes tener más)
Aquí te dejo una herramienta online para hacer pruebas y obtener el keycode de la tecla pulsada:
http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes
Bien, sabiendo esto ya vamos a las implementaciones concretas en cada navegador y aquí es cuando nos encontramos con cosas peculiares como que Explorer y Opera no soportan la opción del ASCII y en su lugar te devuelven el código de la tecla.
Aquí tienes más información acerca de como interpretan los diferentes eventos cada navegador:
http://www.quirksmode.org/js/keys.html
Con esto, y dependiendo de si lo que te interesa es controlar la pulsación de una determinada tecla o de un determinado carácter, te recomendaría por normal general usar el evento keyup (ya que solo se ejecuta una vez) y te quedes con el keycode para compararlo con una lista de las posibles teclas que impriman el carácter que estás esperando.