类型转换

来源:互联网 发布:百分百软件官网 编辑:程序博客网 时间:2024/06/10 01:06
内部类型,如charint等,以及其与数字文字量之间的隐式转换总结起来即为:将一种类型的内存内容用另外一种类型进行解释,短则截取,长则用符号位填充,没有符号位(无符号类型)则填充0

Ø 程序一:

       unsigned char uc = 255;

       char c = uc;

printf("%d\n",c);

输出:-1

解释:将一种类型的内存内容用另外一种类型进行解释。uc是无符号数,占1个字节的内存空间,把255赋值给uc时,内存空间中的二进制如下:

11111111

如果将unsigned charuc转换成char型,那么uc所在的内存空间中的二进制值就会复制到char型变量c的内存空间中,然后引用c时就会以char型对该内存进行解释,这段二进制被解释成char型后就会变成-1

Ø 程序二:

       int i = 255;

       char c = i;

       printf("%d\n",c);

输出:-1

解释:短则截取。对于int型的变量i4个字节,其在内存中的二进制形式如下:

00000000

0000000

00000000

11111111

当将i赋值给char型的变量c时,会将i所在的内存空间中的最低一个sizeof(char)(即一个字节)的内容copyc所在的内存空间中,即只截取适合左值变量大小的空间中的内容。其实用一个4字节的数字文字量给一个char型变量赋初值或用一个8字节的数字文字量给一个intchar型变量赋初值也是类似的情况。

Ø  程序三:

       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型变量c2,在内存中的表示形式如下:

00000010

c用于给int型变量i赋值,即将c转换成int型,先将c的一个字节的内存空间copyi的最低一个字节,然后用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的一个字节的内存内容copyi的最低一个字节,由于cunsigned char型变量,没有符号位, 所以用0填充i剩余的高3个字节,得到i的内存内容如下:

00000000

00000000

00000000

11111110

i的这段内容以int型进行解释,即为255

注:不管将数字文字量赋给什么类型的变量,都是先将数字文字量用4字节或者8字节的空间按第一节中所述的方式表示,然后再利用本节所述的类型转换方式,将该4/8字节空间中的二进制位复制并转换到新类型。


http://mucian.bokee.com/4136626.html

0 0
原创粉丝点击