#include"stdio.h"
main()
{
long int ll_1=48;
long int ll_2=65535;
long int ll_3=65536;
short int sx_1;
short int sx_2;
short int sx_3;
sx_1=(short)ll_1;
sx_2=(short)ll_2;
sx_3=(short)ll_3;
printf("sx_1=%d\n",sx_1);
printf("sx_2=%d\n",sx_2);
printf("sx_3=%d\n",sx_3);
getch();
}
答案是:48 -1 0
对于长整形的65536转换为二进制为1 0000 0000 0000 0000由于短整型只有16为,所以实际上是0000 0000 0000 0000所以为0,
而65535为1111 1111 1111 1111,最高位符号位为1,所以是负值,由于计算机数据是按补码形式保存的,正数补码与原码相同,前面那个65536等于0可以不处理,但是这个是负数,补码是符号位以外的部分取反后加1,所以减1在取反后也就是原码了,首位符号位不变减1,1111 1111 1111 1110,取反1000 0000 0000 0001,所以是-1.
short 类型的范围是-32768~32767,65535越界了。
当short类型数据是32767时,如果再加1就是-32768,从而形成一个循环。
当你输入一个数为32768时,用short型显示就是-32768,而32769==>-32767
从而65535-32768-32768=-1//减第一个32768是使得该数变成-32768,第二个32768则是因为本数已经变成-32768了,记它加上乘余的数.
同理,65536为0