unsigned short sx = -1;
-1是有符号数,unsigned short声明的变量是无符号的,怎么理解?
字面常量-1有符号数,这里的数是指十进制数,以补码的编码形式存储在字节单元中,-1的补码为0xffff。在执行阶段,从常量区拷贝到栈的对应变量单元中,因此栈中变量sx的所在字节单元的内容为0xffff。
unsigned short 指明变量 sx 为无符号数,这里的数是指二进制数。它的作用是表明计算机在面对二进制串的时候,认为是一串二进制原码。
所以,计算机理解“0xffff”为原码,转换为十进制为=65535.
printf("%d",sx);
打印出来的值即为65535.
无符号数与有符号数
人为指定地某个二进制串有无符号。若该二进制串是有符号的,在计算机中它是补码;若该二进制串是无符号的,在计算机中它是原码。
对于同一串二进制“1101”
若人为指定“1101”为无符号数:在计算机中“1101”转化为十进制数为13.
若人为指定“1101”为有符号数:在计算机中“1101”转化为十进制数为-3.
由于补码的可表示范围有正负数,而原码只能表示非负数,所以,站在人的角度(十进制),可以这样理解无符号数与有符号数:
负整数是有符号的,因为通过补码表示;非负整数可认为是有或无符号,因为非负整数原码与补码相同。