Ø 程序一:
unsigned char uc = 255;
char c = uc;
printf("%d\n",c);
输出:-1
解释:将一种类型的内存内容用另外一种类型进行解释。uc是无符号数,占1个字节的内存空间,把255赋值给uc时,内存空间中的二进制如下:
11111111 |
如果将unsigned char型的uc转换成char型,那么uc所在的内存空间中的二进制值就会复制到char型变量c的内存空间中,然后引用c时就会以char型对该内存进行解释,这段二进制被解释成char型后就会变成-1。
Ø 程序二:
int i = 255;
char c = i;
printf("%d\n",c);
输出:-1
解释:短则截取。对于int型的变量i占4个字节,其在内存中的二进制形式如下:
00000000 | 0000000 | 00000000 | 11111111 |
当将i赋值给char型的变量c时,会将i所在的内存空间中的最低一个sizeof(char)(即一个字节)的内容copy到c所在的内存空间中,即只截取适合左值变量大小的空间中的内容。其实用一个4字节的数字文字量给一个char型变量赋初值或用一个8字节的数字文字量给一个int或char型变量赋初值也是类似的情况。
Ø 程序三:
char c = 2;
int i = c;
printf("%d\n",i);
输出:2
Ø 程序四:
char c = -2;
int i = c;
printf("%d\n",i);
输出:-2
Ø 程序五:
unsigned char c = -2;
int i = c;
printf("%d\n",i);
输出:254
解释:长则用符号位填充,没有符号位(无符号类型)则填充0。对于程序三,char型变量c为2,在内存中的表示形式如下:
00000010 |
将c用于给int型变量i赋值,即将c转换成int型,先将c的一个字节的内存空间copy到i的最低一个字节,然后用c的符号位0填充i剩余的高3个字节,所以i的内存形式如下:
00000000 | 0000000 | 00000000 | 00000010 |
于是将i的这段内存内容以int型进行解释,即为2。
对于程序四,变量c为-2,在内存中的表示形式如下:
11111110 |
将c的内存内容复制到i的最低一个字节,并用符号位1填充剩余的高3个字节,得到i的内存形式如下:
11111111 | 11111111 | 11111111 | 11111110 |
于是将i的这段内存内容以int型进行解释,即为-2。
对于程序五,用文字量-2为无符号char型变量c赋值,保存文字量-2的临时4字节内存空间的内容如下:
11111111 | 11111111 | 11111111 | 11111110 |
将该文字量通过截取最低一个字节的内容复制到unsigned char型变量c的内存空间中,得到c的内存内容如下:
11111110 |
再将c用于给int型变量i赋值,先将c的一个字节的内存内容copy到i的最低一个字节,由于c是unsigned char型变量,没有符号位, 所以用0填充i剩余的高3个字节,得到i的内存内容如下:
00000000 | 00000000 | 00000000 | 11111110 |
将i的这段内容以int型进行解释,即为255。
注:不管将数字文字量赋给什么类型的变量,都是先将数字文字量用4字节或者8字节的空间按第一节中所述的方式表示,然后再利用本节所述的类型转换方式,将该4/8字节空间中的二进制位复制并转换到新类型。
http://mucian.bokee.com/4136626.html