I just curious to know why Start alone should contain u64 type other as i64 .
Does it mean that I can read the bytes in reverse if I have negative value for End ?.
With enough work, yes! You can seek in the negative direction, but bytes will still always be read "forward", so you'll need to seek backwards again after every time you read a byte. If you alternate calls to Read::read_exact() with a 1-byte buffer and Seek::seek(SeekFrom::Current(-2), it'll just read backwards, albeit inefficiently. It'd be better to read chunks of bytes, and go backwards once per chunk.
The Start variant has u64 because seeking to a negative position from the start of the file would be nonsensical. It is commonly possible to seek in either direction from the Current position. I don't know of any valid use case for seeking forward from the End position, but then again Rust does not have an int flavor that only provides negative values.
This link is about Delphi, but it says that it is reasonable to allow seeking beyond EOF (and allow programs to write that position).
I don't know whether std::fs::File and other std readers/writers allows seeking beyond EOF or not, but allowing it could be useful or efficient in some situations (e.g. writing sparse file).