当赋予整数大于255的无符号字符时,它会给出不同的输出,为什么? #包括 int main() { 无符号字符c=292; printf(“%d\n”,c); 返回0; }

当赋予整数大于255的无符号字符时,它会给出不同的输出,为什么? #包括 int main() { 无符号字符c=292; printf(“%d\n”,c); 返回0; },c,unsigned-char,C,Unsigned Char,以下代码给出了输出“36”。 我想知道为什么会发生这种情况?因为292不适合unsigned char类型的变量 我建议您编译此程序: #include<stdio.h> int main() { unsigned char c =292; printf("%d\n",c); return 0; } 因此,在我的系统中,UCHAR\u MAX是255,这是允许分配给c的最大值 292只会溢出c,因为它是一个无符号类型,所以它从0到255,因此它会环绕,得到29

以下代码给出了输出“36”。
我想知道为什么会发生这种情况?

因为292不适合
unsigned char
类型的变量

我建议您编译此程序:

#include<stdio.h>
int main()
{
   unsigned char c =292;
   printf("%d\n",c);
   return 0;
}  
因此,在我的系统中,
UCHAR\u MAX
是255,这是允许分配给
c
的最大值

292只会溢出
c
,因为它是一个无符号类型,所以它从0到255,因此它会环绕,得到292-(255+1)=36

字符数据类型的大小为1字节,范围为0到255。 但这里的初始化大于255(即c=292>255)

因此,c存储第(292-255)个值(即第37个值),并且c存储的值是36(因为0是第一个值)

这意味着您必须初始化c=36。

最后是printf()func。从内存中获取值并打印值36


将292转换为二进制时,将得到0001 0010 0100(9位)。 但不幸的是,字符变量只能存储1字节(8位)。 所以需要最后8位。ie:0010 0100,等于十进制中的36。
希望这对您有所帮助,因为292太大了。编译时会有额外提示的警告。在您的系统上打印
UCHAR\u MAX
二进制值256为
100000000
。看起来高于8位的信息被丢弃了,剩下36位在较低的字符位。无符号字符-->0到255,溢出:我想你的意思是
292-(255+1)
。非常感谢@AjayBrahmakshatriya!
#include <stdio.h>
#include <limits.h>
int main()
{
   unsigned char c =292;
   printf("%d %d\n", c, UCHAR_MAX);
   return 0;
}
prog.c: In function 'main':
prog.c:5:21: warning: unsigned conversion from 'int' to 'unsigned char' changes value from '292' to '36' [-Woverflow]
    unsigned char c =292;
                     ^~~
36 255