【问题标题】:what happens while type casting to a different data type类型转换为不同的数据类型时会发生什么
【发布时间】:2010-12-16 09:29:39
【问题描述】:

为什么这段代码的输出是 fffffffa 而不是 0000000a

字符 c=0Xaa; int b=(int)c; b=b>>4; printf("%x",b);

我认为 char c=OXaa 将是 aa,当它被类型转换为 int 时,它会更改为 000000aa。

谁能告诉我当 char 被强制转换为整数时发生了什么..

【问题讨论】:

  • 已经将大于 127 的值分配给 char 可能会导致未定义的行为。不要那样做,但总是将'a' 类型常量分配给普通的char。要在其中有一个十六进制值,您可以使用'\xaa',就像您的示例一样,但是当您超出界限时,编译器更有可能告诉您。

标签: c


【解决方案1】:

int 已签名,因此向上转换是符号扩展的。考虑二进制表示。

0xAA = 10101010

char 通常是带符号的,因此当您转换为(默认带符号的)int 时,第一个 1 意味着它被解释为负二进制补码:

((int) ((signed char)0xAA) ) = 11111111111111111111111110101010

为避免这种情况,请使用unsigned charunsigned int

【讨论】:

  • 谢谢 robert,所以如果 char c=Ox77(租赁位为 0)。那么当类型转换为 int 时,这是否提供 00000077(十六进制)?
  • 是的,应该。但是,如果您不想要符号扩展,则应该使用 unsigned 类型明确说明。
  • 好的,非常感谢罗伯特。你的解释对我帮助很大
【解决方案2】:

编译器的 char 类型是有符号的,因此当它转换为 int 时,它会进行符号扩展,因为设置了最高位。

然后,右移运算符保持负性,并在顶部移入新的。右移一个负值是一个未定义的操作,所以不要这样做。

【讨论】:

  • printf("%x\n", c); -> c=ffffffaa.
  • 谢谢放松。所以char c = OX77,即01110111。现在,当它被类型转换为int并右移时,它会变成00000007(十六进制)吗?如果是这样,我从您的评论中认为是正确的
  • 右移 >> 负值是实现定义的行为;左移<< 负值是未定义的行为。
  • @pmg - 左移负值与左移正值相同,不是吗?并且右移有符号值通常会执行符号扩展,但不会在无符号上执行。只是使用正确类型的另一个论据!
【解决方案3】:

这取决于所使用的架构 (CPU) 以及编译器。

在您的情况下,我的猜测是变量 c 的值被放置在 cpu 寄存器中,其中仅定义了低 8 位。当转换为 int 并复制到另一个变量时,那些具有“未定义”值的位也会被复制,并且由于它们现在是整数值的一部分,因此被视为有效。

要克服这个问题,您可能需要像这样复制 c 值:

int b = (int)c & 0xff;

【讨论】:

  • 啊,我忽略了 unwind 提到的标志问题。所以,他的回答在这个例子中更准确。但在其他情况下,最好注意将值转换为更大类型的影响。
猜你喜欢
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2018-05-16
相关资源
最近更新 更多