#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
输出为2!我们如何获得以下输出?
如何变量工作的范围? c语言中不同数据类型的范围是多少?
#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
输出为2!我们如何获得以下输出?
如何变量工作的范围? c语言中不同数据类型的范围是多少?
在分配为更小的类型的值是
258 % 256
如果新类型是unsigned否则,如果新类型是无符号的,所述值是通过 转换反复加上或减去比米多一个aximum值 可以在新的类型,直到该值是在 新型的范围来表示。
否则,新的类型是有符号和值不能表示在它 ;结果是实现定义的或实现定义的信号被引发。
因此,所有花哨“加或减”是指它就像你说的是分配:
ch = i % 256;
char
是8位长,而258
需要九个位来表示。转换为char
剔除258
的最高有效位,即100000010
二进制,导致10
,即2
二进制。
当你传递char
到printf
,它得到促进到int
,然后由%d
格式说明回升,并打印2
。
#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
这里i
是0000000100000010
机器水平。 ch
需要1个字节,所以它需要最后8位,它是00000010
,它是2.
为了找出C语言中各种类型的时间有多长,您应该参考limits.h(或C++中的爬升) 。字符不保证是8位长。它只是:
可以包含基本字符集的机器的最小可寻址单位。它是一个整数类型。实际类型可以是带符号的也可以是无符号的,具体取决于实施方式
对其他类型的模糊定义也是相同的。
或者,您可以使用运算符sizeof
以字节为单位动态查找类型的大小。
您不可以假设原生C数据类型的确切范围。标准的地方只有最小的限制,所以你可以说unsigned short
可以容纳至少65536个不同的值。上限可以不同
参见Wikipedia更多读数
这是一个溢出;结果是不确定的,因为char
可能是signed
(未定义行为)或unsigned
(定义明确的“环绕”行为)。
炭上8位所以,当你施放(分配的整数为char),在32位机中,I(int是在32位)var为:
00000000 00000000 00000001 00000010 = 258 (in binary)
当你想从这个中断一个字符,您截断后8位(一个字符是8位),让您得到:
00000010这在十进制意味着2,这就是为什么你看到此输出。
问候。
您正在使用little-endian机器。的258
二进制表示是
00000000 00000000 00000001 00000010
而分配整数烧焦,只有8个字节的数据被复制到char。即LSB。
这里只有00000010
即0x02将被复制到字符。
相同的代码会给零,如果是big-endian机器。
C未定义。错字? – wildplasser 2012-07-29 11:39:16
@JanTuroň这不是一个溢出,欢迎来到C. – ouah 2012-07-29 11:39:58