#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
输出为2!
变量的范围如何? c langauge中不同数据类型的范围是什么?
答案 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
在计算机级别为0000000100000010
。 ch
占用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 机器的情况下,相同的代码将给出零。