2012-07-29 69 views
2
#include <stdio.h> 

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

输出为2!我们如何获得以下输出?

如何变量工作的范围? c语言中不同数据类型的范围是多少?

+0

C未定义。错字? – wildplasser 2012-07-29 11:39:16

+1

@JanTuroň这不是一个溢出,欢迎来到C. – ouah 2012-07-29 11:39:58

回答

4

在分配为更小的类型的值是

  • 截短,即258 % 256如果新类型是unsigned
  • 在一个实现定义的方式改性,如果新类型是有符号

否则,如果新类型是无符号的,所述值是通过 转换反复加上或减去比米多一个aximum值 可以在新的类型,直到该值是在 新型的范围来表示。

否则,新的类型是有符号和值不能表示在它 ;结果是实现定义的或实现定义的信号被引发。

因此,所有花哨“加或减”是指它就像你说的是分配:

ch = i % 256; 
+0

类型在这里签名。 – ouah 2012-07-29 11:40:43

+1

@ouah你怎么知道?据我所知,由于OP没有指定,所以'ch'可以是有符号的或无符号的。 – cnicutar 2012-07-29 11:41:04

+0

好吧,对不对。但很可能是因为'char'在大多数平台上都有签名。 – ouah 2012-07-29 11:42:02

3

char是8位长,而258需要九个位来表示。转换为char剔除258的最高有效位,即100000010二进制,导致10,即2二进制。

当你传递charprintf,它得到促进int,然后由%d格式说明回升,并打印2

1
#include <stdio.h> 

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

这里i0000000100000010机器水平。 ch需要1个字节,所以它需要最后8位,它是00000010,它是2.

1

为了找出C语言中各种类型的时间有多长,您应该参考limits.h(或C++中的爬升) 。字符不保证是8位长。它只是:

可以包含基本字符集的机器的最小可寻址单位。它是一个整数类型。实际类型可以是带符号的也可以是无符号的,具体取决于实施方式

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

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

您不可以假设原生C数据类型的确切范围。标准的地方只有最小的限制,所以你可以说unsigned short可以容纳至少65536个不同的值。上限可以不同

参见Wikipedia更多读数

0

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

1

炭上8位所以,当你施放(分配的整数为char),在32位机中,I(int是在32位)var为:

00000000 00000000 00000001 00000010 = 258 (in binary) 

当你想从这个中断一个字符,您截断后8位(一个字符是8位),让您得到:

00000010这在十进制意味着2,这就是为什么你看到此输出。

问候。

0

您正在使用little-endian机器。的258

二进制表示是

00000000 00000000 00000001 00000010 

而分配整数烧焦,只有8个字节的数据被复制到char。即LSB。

这里只有00000010即0x02将被复制到字符。

相同的代码会给零,如果是big-endian机器。