The question "should bytes be signed?" isn't really a meaningful language design question. Generally speaking, we don't start by deciding what names we're going to have and then figure out what those names should refer to. Instead, we start by deciding what things we're going to have, and then we figure out what those things should be named.
The meaningful questions are:
- Should your language offer an unsigned 8-bit integer type?
- Should your language offer a signed 8-bit integer type?
- What should the above types be called? In particular, should one of them be called "byte"?
The answers to questions 1 and 2 depend on what your goals are. At one extreme, Python 3 offers no fixed-width integer types; the only integer type you get is
int, which theoretically can hold integers of any size whatsoever. That's because Python has a focus on ease of use, and for most purposes, an arbitrary-sized integer type is very easy to use. Near another extreme, the LLVM language offers integer types of every width from 1-bit up to 8388608-bit. That's because LLVM has a focus on being able to produce efficient machine code, and all bit widths are potentially useful for efficiency.
I will mention that by convention, the range of numbers from 0 to 255 seems to be used much more often than the range from -128 to 127, so if you're going to offer only one type or the other, you should probably offer the unsigned 8-bit integer type.
Once you've decided which types to offer, the next question is what to call them. Rust takes a very simple and sensible approach to naming integer types: an unsigned 8-bit is called
u8, a signed 8-bit is called
i8, an unsigned 16-bit is called
u16, a signed 16-bit is called
i16, and so on. It's hard to find any fault with this system!
In common usage, the word "byte" generally means "nonnegative integer less than 256," so if you have an unsigned 8-bit integer type, naming it "byte" would certainly make sense. If you have a signed 8-bit integer type, naming it "byte" would be confusing; something like "int8" would be a much better name.
TL;DR: Don't name anything a "byte" until after you've already decided what integer types you're going to have. It's more useful to have an unsigned 8-bit integer type than a signed 8-bit integer type. After you've decided on your integer types, either name the unsigned 8-bit integer type "byte," or don't name any of them "byte."