将转换字符输入到整数

时间:2014-05-05 16:23:26

标签: c casting

我想知道关于类型转换的一件事,据我所知,变量可以在某些操作中转换为其他类型。

int c;
char i;
i = (char)c; 

c类型转换为字符并分配给i。其中c= (int)i;类型将i转换为整数。

上述两项行动有何不同?使用类型转换将字符指定为整数时会发生什么?

3 个答案:

答案 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)

在这种情况下,无论你是否写剧本都没有区别。问题是charint转换。在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,那么它是超出范围。

当您指定超出范围的值时,会发生什么取决于目标类型是否已签名。

  • 如果您的charunsigned,那么该值会以CHAR_MAX+1模式调整,直到它在范围内
  • 如果您的charsigned,则行为实施定义

后者意味着编译器必须记录发生的情况。它也被允许发出信号(类似于发生的段错误,如果你不熟悉信号)。

在典型系统中,编译器将采用2的补码表示的低8位,但这肯定不是你应该依赖的东西;为了编写健壮的代码,你应该避免触发这个操作。

您可以通过执行#include <limits.h>并查看CHAR_MINCHAR_MAX来检查类型的范围。 (可以通过printf("%d, CHAR_MIN);等输出。)