You'll find that your first value is moving about 1.4 times as fast as the second, based on the lengths of the vectors:
length = sqrt( x*x + y*y )
sqrt( 1*1 + -1*-1 ) = 1.414...
sqrt( 1*1 + 0*0 ) = 1
And you're right, it's about normalizing values. All normalizing does is make the length of that vector 1 unit long - hence it's called a unit vector. On the plus side, normalizing is simple! Either languages have it build in and you can just do:
Vector2 dirNormalized = direction.Normalize();
Or, you can do it manually by dividing each component by the length:
float length = sqrt( direction.X*direction.X + direction.Y*direction.Y )
Vector2 dirNormalized = new Vector2( direction.X / length, direction.Y / length );
I would use the built-in methods. Much less hassle. ;)
If you want to specify directions at arbitrary angles, the easiest way to do this is using trigonometry:
Vector2 direction = new Vector2();
direction.X = Math.Cos( angleInRadians );
direction.Y = Math.Sin( angleInRadians );
This will give you a unit vector in the direction of angleInRadians
from your left example, going counter-clockwise. If this sounds complicated, think of it as a clock hand that starts at 3 and goes counter-clockwise as the angle increases, and reaches back to 3 at 2*PI radians, or 360 degrees.
To get extra-fancy, multiply these by a 'speed' value to get a velocity vector:
float speed = 8.5f;
direction.X = speed * Math.Cos( angleInRadians );
direction.Y = speed * Math.Sin( angleInRadians );
This will give you a vector of length 8.5, with the direction specified by the angle.