This bugs me...
Data types in C# have stupid names.
byte - It's unsigned. Ok, that's reasonable so far.
sbyte - Signed byte. I guess that's alright.
int - Ok, an integer. It's signed. What?
uint - This is an unsigned int?
Why isn't it sint or ubyte? Don't mix them. If I can use s<type> for signed, then use s<type> for all of them. Don't use s for some and u for others!
Yeah. Not nice to see. I don't know why they would be named like that, but I can haphazard a guess: Code simplicity, provided you understand the meaning of the data types; Unsigned byte is a more common data type, than signed byte for sure. So "byte" it is. Conversely, a signed integer is by far a more common data type than a signed one. So... yeah.
In any case, the problem goes away if you use the CLS compliant names (which we probably should anyways). In that case we have:
Int16 - signed
UInt16 - unsigned
Int32 - signed
UInt32 - unsigned
That's exactly it - it's all about frequency of use. byte and char are unsigned, while short, int, and long are signed, because those are simply the most common uses of those data types. It's a departure from C/C++ where everything defaults to signed unless you use the unsigned keyword.
While it may make the learning curve a bit steeper, once you're familiar with the language you'll come to appreciate it I think, since it makes the most commonly used form the shortest, and the one that doesn't need any special prefixes.