To keep it consistent with other commands, such as getrange, negative offset should count from the end.

Comment From: sundb

It used to be implemented, but I dont't know why it was removed from https://github.com/redis/redis/commit/8f8eeffec1fe1c0d40b6d078121661d7cfb02c08, but the comments tell us something.

/* Convert negative indexes. Note that for SETRANGE, the meaning of a
 * negative index is a little different than for other commands.
 * Here, an offset of -1 points to the trailing NULL byte of the
 * string instead of the last character. */

Comment From: madolson

It seems weird that SETRANGE used to use a different semantic for negative offsets. If we support this, we should also add it for SETBIT perhaps as well.