What is the difference between unsigned length and unsigned long?
They are two different types, even though they are the same size and representation in some particular implementation.
unsigned long
at least 32 bits are required. unsigned long long
at least 64 bits are required. (In fact, requirements are specified in terms of the ranges of values they can represent.)
As you saw, this is consistent with both being the same size if that size is at least 64 bits.
In most cases, the fact that they are different types does not really matter (except that you cannot depend on them for the same range of values). For example, you can assign to an unsigned long long
object unsigned long
and the value will be implicitly converted, possibly with some loss of information. Similarly, you can pass an argument to a unsigned long long
function expecting unsigned long
(if the function is not a variable, for example printf
, then an explicit conversion is required).
But one case where it matters is when you have pointers. The types unsigned long*
and are unsigned long long*
not just different, they are not compatible with the purpose because there is no implicit conversion from one to the other. For example, this program:
int main()
{
unsigned long* ulp = 0;
unsigned long long* ullp = 0;
ulp = ullp; // illegal
}
produces the following when I compile it with g ++:
c.cpp: In function ‘int main()’:
c.cpp:5:11: error: cannot convert ‘long long unsigned int*’ to ‘long unsigned int*’ in assignment
Another difference: Standard C ++ does not add types long long
and unsigned long long
up to 2011. C added them to the 1999 standard, and it's not uncommon for pre-C ++ 2011 (and pre-C99) to provide them as an extension.
source to share
This is an implementation defined as iammilind point see How many unsigned bytes are long long? for more details
source to share