我们如何获得以下输出?

时间:2012-07-29 11:35:11

标签: c casting

#include <stdio.h>

int main(void)
{ 
    int i = 258;
    char ch = i;
    printf("%d", ch)
}

输出为2!

变量的范围如何? c langauge中不同数据类型的范围是什么?

7 个答案:

答案 0 :(得分:4)

分配较小的类型时,值为

  • 截断,如果新类型未签名则为258 % 256
  • 如果新类型已签名,则以实现定义的方式进行修改
  

否则,如果新类型是无符号的,则转换为   重复加或减一个以上的最大值   可以用新类型表示,直到值在范围内   新类型

     

否则,新类型已签名且无法表示该值   在里面;要么结果是实现定义,要么是   提出了实现定义的信号。

所有那些花哨的“加或减”意味着它的分配就像你说的那样:

ch = i % 256;

答案 1 :(得分:3)

char是8位长,而258需要9位来表示。转换为char剁掉258的最高有效位(100000010为二进制,产生10,其为二进制2

当您将char传递给printf时,它会提升int,然后由%d格式说明符选中,并打印为2

答案 2 :(得分:1)

#include <stdio.h>

int main(void)
{ 
    int i = 258;
    char ch = i;
    printf("%d", ch)
}

此处i在计算机级别为0000000100000010ch占用1个字节,因此最后8位,00000010,为2。

答案 3 :(得分:1)

为了找出C语言中各种类型的使用时间,你应该参考limits.h(或者用C ++编写)。 char不保证是8位长。它只是:

  

可以包含基本字符集的机器的最小可寻址单元。它是整数类型。实际类型可以是有符号或无符号,具体取决于实现

对其他类型也有相同的模糊定义。

或者,您可以使用运算符sizeof以字节为单位动态查找类型的大小。

您可能不会假设本机C数据类型的确切范围。标准只限制了最小限制,因此您可以说unsigned short至少可以容纳65536个不同的值。上限可以不同

有关更多信息,请参阅Wikipedia

答案 4 :(得分:1)

char在 8位上,所以,当你强制转换(为char分配一个整数)时,在 32位机器中,i(int在32位上) )var是:

00000000 00000000 00000001 00000010 = 258 (in binary)

当你需要来自这个int的char时,你会截断最后8位(char是8位),所以你得到:

00000010这意味着2位十进制,这就是你看到这个输出的原因。

问候。

答案 5 :(得分:0)

这是溢出;结果是未定义的,因为char可能是signed(未定义的行为)或unsigned(明确定义的“环绕”行为)。

答案 6 :(得分:0)

您正在使用 little-endian 计算机。

258的二进制表示是

00000000 00000000 00000001 00000010

将整数赋给char时,只有8字节的数据被复制到char。即LSB。

这里只有00000010,即0x02将被复制到char。

big-endian 机器的情况下,相同的代码将给出零。

相关问题