1. 循环输入的二种表示
- ~是按位取反
scanf的返回值是输入值的个数,如果没有输入值就是返回-1,-1按位取反结果是0
while(~scanf("%d", &n))就是当没有输入的时候退出循环
- EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
EOF 的值通常为 -1
2. 两个值交换的第二种思路
a^=b; b^=a; a^=b;
解释:
a'=a^b;
b=b^a'=b^a^b=a;
a=a'^a=a^b^a=a;
3. int最大值
补码=反码(原码符号位不变 再取反) +1
16位的int取值范围分为无符号整型(unsigned int)和有符号整型(signed int)。
无符号整型是0000 0000 0000 0000 ~ 1111 1111 1111 1111,对应的十进制数为0到65535(即2^16-1)。
要理解有符号整型首先要了解两个规定:
符号位:对于有符号整型,存储单元中最高位代表符号位:0为正,1为负。
有符号整型的负数表示方法:补码(原码先取反再加1得到补码)。
举例:表示16位的-1。
1的原码:0000 0000 0000 0001;
取反(01互换):1111 1111 1111 1110;
加1:1111 1111 1111 1111。
得到-1的补码为1111 1111 1111 1111。
所以16位二进制有符号整型的-1就表示为1111 1111 1111 1111。
所以16位二进制数有符号整型的表示范围为:
正数,最高位为0,取值范围如下:
0000 0000 0000 0001 到 0111 1111 1111 1111
对应的十进制数为1到32767(2^15-1)。
0,全部位为0:
0000 0000 0000 0000。
负数,最高位为1,取值范围如下(以补码形式表示):
1111 1111 1111 1111 到 1000 0000 0000 0000
对应的十进制数为-32768到-1,即-2^15到-1。
综上,16位二进制数有符号整型的取值范围是-32768到32767。
加深理解:题主问题中问-32768(-2^15) 怎么来的,1000 0000 0000 0000在无符号整型中表示2^15 怎么在有符号整型中就表示-2^15 了呢?这里可以通过补码减1取反倒推出原码。
补码:1000 0000 0000 0000
减1:0111 1111 1111 1111
取反得到原码:1000 0000 0000 0000(2^15)
原码补码相同,只是个巧合。
|