#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
输出为 2!
变量的范围如何工作?c语言中不同数据类型的范围是多少?
当分配给较小的类型时,值是
258 % 256
如果新类型是无符号的否则,如果新类型是无符号的,则通过 在新类型中可以表示的最大值的基础上反复加减一来转换该值,直到该值在新类型的范围内。
否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。
因此,所有花哨的“加法或减法”意味着它的分配就像您说的那样:
ch = i % 256;
char
是 8 位长,而258
需要 9 位来表示。转换为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。
char 为8 位,因此,当您转换(将整数分配给 char)时,在32 位机器中,i(int 为 32 位)var 为:
00000000 00000000 00000001 00000010 = 258 (in binary)
当你想要一个来自这个 int 的 char 时,你会截断最后 8 位(char 是 8 位),所以你得到:
00000010 表示十进制的 2,这就是你看到这个输出的原因。
问候。
为了找出 C 语言中各种类型的长度,您应该参考 limits.h(或 C++ 中的 climits)。char 不保证为 8 位长。它只是:
机器的最小可寻址单元,可以包含基本字符集。它是一个整数类型。实际类型可以是有符号的或无符号的,具体取决于实现
其他类型也有相同的模糊定义。
或者,您可以使用运算符sizeof
动态找出类型的大小(以字节为单位)。
您可能无法假设本机 C 数据类型的确切范围。标准只放置最小的限制,所以你可以说unsigned short
至少可以容纳 65536 个不同的值。上限可能不同
更多阅读请参考维基百科
您正在使用little-endian机器。
258 的二进制表示是
00000000 00000000 00000001 00000010
在将整数分配给 char 时,只有 8 个字节的数据被复制到 char。即LSB。
这里只有00000010
ie 0x02 会被复制到 char 中。
在大端机器 的情况下,相同的代码将给出零。
这是溢出;结果是未定义的,因为char
可能是signed
(未定义的行为)或unsigned
(明确定义的“环绕”行为)。