char到int转换输出背后的原因是什么?

时间:2018-02-20 10:26:31

标签: c

例如:

android:icon="@mipmap/ic_app_icon"

这将输出-1。无论如何要手工推出?

4 个答案:

答案 0 :(得分:5)

为了手动推导,您需要了解系统的几个实现定义方面 - 即

  • 如果char已签名
  • 如果char已签名,则使用什么表示方案
  • 您的系统如何处理无法在窄类型中精确表示的值的缩小转换。

虽然标准允许实现决定,但缩小转换的一种非常常见的方法是截断不适合窄类型的位。假设这是您的系统采用的方法,计算输出的第一部分是找到被转换的int值的最后8位。在你的情况下,65535是1111111111111111 2 ,所以后8位都是1。

现在你需要决定11111111 2 的解释。在您的系统上char已签名,系统使用负值的二进制补码表示,因此此模式被解释为八位-1值。

当您致电printf时,签名char的8位值会提升为int,因此会打印保留的值。

在默认情况下char未签名的系统上,相同的模式将被解释为255。

答案 1 :(得分:4)

655350xffff

转换为char时,左边的位保持不变:

0xffff0xff0xff

将char传递给函数时,它会扩展为int。由于char的最左边的位是1,这将是符号扩展的,因此它将变为0xffffffff(32位)

这是-1,因此打印为-1。

<小时/> 正如Dasblinkenlight所指出的那样,无论char是有符号还是无符号(无论是作为实现的默认值还是作为声明unsigned char y),都很重要。我的最后一行将读取unsigned char:

将未编译的char传递给函数时,它会扩展为unsigned int。因为它是无符号的,所以在左边只添加了零,因此它将变为0x000000ff(32位)。

这是255,所以255打印为。

答案 2 :(得分:0)

转换为binary时,

65535为1111111111111111。 当你将它分配给一个字符变量时,它会被修剪为最低有效8位,即11111111

这相当于Binary中的-1。任何数字的2's complement都会给出negative value,因此2的补码为00000001: 11111110 + 1 = 11111111是-1。

答案 3 :(得分:0)

\java

&#39; x&#39;的价值65535相当于十六进制的int x = 65535; ,表示2字节(16位)数。

然后&#39; x&#39;的价值正在转变为角色&#39; y&#39;并且字符数据类型的大小是1字节(8位)。所以x的右侧值是截止的,同时分配给&#39; y&#39;因为它只有1B内存空间。

所以&#39; y&#39;的价值是0xffff (binary = 1111 1111 1111 1111),它等于有符号数字整数表示中的0xff (binary = 1111 1111)

我们正在展示&#39; y&#39;按整数表示的字符值由&#39;%d&#39;