当使用大于255的整数分配unsigned char时,它会给出不同的输出,为什么?

时间:2017-10-27 04:39:41

标签: c unsigned-char

#include<stdio.h>
int main()
{
   unsigned char c =292;
   printf("%d\n",c);
   return 0;
}  

以下代码给出了输出&#34; 36&#34;。 我想知道为什么会这样?

3 个答案:

答案 0 :(得分:4)

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

我建议你编译这个程序:

#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

因此,我系统中的UCHAR_MAX为255,这是您可以分配给c的最大值。

292只是溢出c,因为它是无符号类型,它从0到255,因此它会回绕,给你292 - (255 + 1)= 36。

答案 1 :(得分:1)

  

char data_type的大小为1个字节,范围为0到255。   但这里初始化超过255(即c = 292> 255)

     

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

     

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

     

最后,printf()函数。从内存中获取值并打印值36。

答案 2 :(得分:0)

将292转换为二进制时,将得到0001 0010 0100(9位)。 但不幸的是,一个字符变量只能存储1个字节(8位)。 因此,它将占用最后8位。即:0010 0100,等于十进制的36。 希望对您有帮助