我想知道关于类型转换的一件事,据我所知,变量可以在某些操作中转换为其他类型。
int c;
char i;
i = (char)c;
Run Code Online (Sandbox Code Playgroud)
类型转换c为字符并分配给i. 其中c= (int)i;类型转换i为整数。
上面提到的两种操作有什么区别吗?当使用类型转换将字符分配为整数时会发生什么?
基本上,当您将类型从较高类型转换为较低类型时,会发生截断。即发生数据丢失
#include<stdio.h>
int main()
{
char c;
int i=2000;
c=(char)i;
printf("%d",c);
}
Run Code Online (Sandbox Code Playgroud)
i=2000 的位表示
---> (MSB) 0000011111010000(LSB)
因此,当您将 int 类型转换为 char 时,这里的 char 是 8 位,而 lsb 中仅存储 8 位,其余位被截断。即 --> 11010000通常这个值被存储在c
取上面一个的两个补码来获得价值。
--->00110000 即 48MSB位是1因为它的有符号字符所以最终值是
---> -48
include<stdio.h>
int main()
{
char c=200;
int i;
i=(int)c;
printf("%d",i);
}
Run Code Online (Sandbox Code Playgroud)
c=200 的位表示是 11001000
因此,当您将 char 类型转换为 int MSB 位时,这里 int 是 32 位得到扩展。它是一个依赖于机器的实现。如果 MSB 为 1,则在其余位填充 0 零时发生符号扩展
来自 K&R
将字符转换为整数有一个微妙的地方。该语言没有指定 char 类型的变量是有符号还是无符号数量。当 char 转换为 int 时,它会产生负整数吗?答案因机器而异,反映了架构的差异。在某些机器上,最左边位为 1 的字符将被转换为负整数(“符号扩展”)。在其他情况下,通过在左端添加零将 char 提升为 int,因此始终为正。