2
#include <stdio.h>

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

输出为 2!

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

4

7 回答 7

4

当分配给较小的类型时,值是

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

否则,如果新类型是无符号的,则通过 在新类型中可以表示的最大值的基础上反复加减一来转换该值,直到该值在新类型的范围内

否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。

因此,所有花哨的“加法或减法”意味着它的分配就像您说的那样:

ch = i % 256;
于 2012-07-29T11:37:51.947 回答
3

char是 8 位长,而258需要 9 位来表示。转换为char砍掉二进制的最高有效位,导致, 是258二进制的。100000010102

当您传递char到 时printf,它会被提升为,然后由格式说明符int拾取,并打印为。%d2

于 2012-07-29T11:39:27.057 回答
1
#include <stdio.h>

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

i0000000100000010机器级别的。ch占用 1 个字节,因此占用最后 8 位,它是00000010,它是 2。

于 2012-07-29T11:53:36.643 回答
1

char 为8 位,因此,当您转换(将整数分配给 char)时,在32 位机器中,i(int 为 32 位)var 为:

00000000 00000000 00000001 00000010 = 258 (in binary)

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

00000010 表示十进制的 2,这就是你看到这个输出的原因。

问候。

于 2012-07-29T13:24:37.933 回答
1

为了找出 C 语言中各种类型的长度,您应该参考 limits.h(或 C++ 中的 climits)。char 不保证为 8 位长。它只是:

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

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

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

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

更多阅读请参考维基百科

于 2012-07-29T12:04:09.897 回答
0

您正在使用little-endian机器。

258 的二进制表示是

00000000 00000000 00000001 00000010

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

这里只有00000010ie 0x02 会被复制到 char 中。

在大端机器 的情况下,相同的代码将给出零。

于 2012-08-01T11:31:17.837 回答
0

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

于 2012-07-29T12:55:11.907 回答