我想知道关于类型转换的一件事,据我所知,变量可以在某些操作中转换为其他类型。
int c;
char i;
i = (char)c;
将c
类型转换为字符并分配给i
。其中c= (int)i;
类型将i
转换为整数。
上述两项行动有何不同?使用类型转换将字符指定为整数时会发生什么?
答案 0 :(得分:4)
基本上,当您从较高类型键入强制转换为较低类型时,会发生截断。即数据丢失
#include<stdio.h>
int main()
{
char c;
int i=2000;
c=(char)i;
printf("%d",c);
}
i = 2000
的位表示 ---&GT; (MSB)0000011111010000
(LSB)
所以这里char是8位,当你将int转换为char时,只有8位来自lsb得到存储的剩余位被截断。
即 - &gt; 11010000
通常此值存储在c
获取上述一个补充,以获得价值。
---&gt; 00110000
,即48和MSB
位是1
,因为它的签名字符所以最终值为
---&GT; -48
include<stdio.h>
int main()
{
char c=200;
int i;
i=(int)c;
printf("%d",i);
}
c = 200的位表示为11001000
所以当你将char命名为int时,int是32位,MSB位被扩展。它是一个依赖于机器的实现。如果MSB为1,则如果在其余位中填充0 0,则发生符号扩展
来自K&amp; R
关于将字符转换为整数,有一个微妙的观点。语言确实如此 不指定char类型的变量是有符号数还是无符号数。当一个char是 转换为int,它能产生负整数吗?答案因机器而异 加工,反映建筑的差异。在一些机器上最左边的一个字符 bit是1将被转换为负整数(``sign extension' “ )。在其他人,炭是 通过在左端添加零来提升为int,因此总是为正。
答案 1 :(得分:3)
在C中, char 实际上是一个8位的小符号整数, int 通常有16或32位也是有符号整数。
否则
char c = X;
int i = (int)c;
将 c 的8位复制到 i 并展开 c 的符号。即 c 中的-10将在 i 中设置-10。
但是在做
int i = X;
char c = (char) i;
只会将 i 的8个最低有效位复制到 c 中。 i 的其余位丢失(使用gcc -Wall
发出警告)。
答案 2 :(得分:0)
在这种情况下,无论你是否写剧本都没有区别。问题是char
到int
的转换。在C中,这两种类型之间存在隐式转换:您可以在没有强制转换的情况下将其中一个分配给另一个,并进行转换。演员表是显式转换。换句话说,i = c;
和i = (char)c;
完全相同。
要理解转换,我似乎更容易根据值进行思考,而不是表示,符号扩展等等。
当您撰写i = c;
时,表示i
的值应与c
的值相同。如果c
为-4
,则i
也将为-4
,无论在内存中设置哪些位来表示此内容。
这始终有效,因为所有可能的char
值都是有效的int
值。
但是,当您c = i;
时,您可能会发现i
的值不是有效char
。例如,如果您的编译器提供char
范围[-128, 127]
(这是常见的,但不是唯一的可能性),而i
的值为150
,那么它是超出范围。
当您指定超出范围的值时,会发生什么取决于目标类型是否已签名。
char
为unsigned
,那么该值会以CHAR_MAX+1
模式调整,直到它在范围内char
为signed
,则行为实施定义。后者意味着编译器必须记录发生的情况。它也被允许发出信号(类似于发生的段错误,如果你不熟悉信号)。
在典型系统中,编译器将采用2的补码表示的低8位,但这肯定不是你应该依赖的东西;为了编写健壮的代码,你应该避免触发这个操作。
您可以通过执行#include <limits.h>
并查看CHAR_MIN
,CHAR_MAX
来检查类型的范围。 (可以通过printf("%d, CHAR_MIN);
等输出。)