以下内容基于系统为32位,64位也行
1. 代码如下(C语言)
#include <stdio.h>
int main(){
short a=(short)(32768);
char c = (char)(32768);
printf("%d\n",a);//-32768
printf("%d\n",c);//0
}
2.为什么32768用short类型强制转换后变成-32768?
- 易知short类型的范围为-32768~32767
- 32768用二进制表示为:1000 0000 0000 0000
- 由于short类型占2字节=16位,因此转换时,系统会查看这16位的数。我们知道,16位二进制数可以表示2^16个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。
3.为什么32768用char类型强制转换后变成0?
- 易知char类型的范围为-256~255
- 32768用二进制表示为:1000 0000 0000 0000
- 由于char类型占1字节=8位,因此转换时,系统会只查看最后8位,因此得0000 0000,相当于将32768%256,得到的余数就是转换后的结果。显然结果为0
- 如果用32769那么就会得到1。 想一想为什么?