In the context of an vector declaration how does y downto x work when x > 0?
It's used for slicing larger words, we need to do that all the time.

For instance, if you were coding a floating point unit, you might have the following declarations (this is not a valid IEEE754 real, nor is it valid VHDL!)

variable real_num is array(31 downto 0) of std_logic_vector
exponent := real_num(31 downto 24)
mantissa := real_num(23 downto 0)

Exponent could have been declared as either (31 downto 24) or (7 downto 0), and each have their advantages, each will result in 8 bits being assigned, but will be labelled differently in the debug screen. As long that you index them consistently when you slice and concatenate, everything will work.