为什么打印unsigned char输出如此之多?

时间:2015-07-21 11:19:42

标签: c char printf unsigned

我正在打印unsigned char类型的变量(8位长)。 但是printf()在我正在打印的变量范围之外输出了一个巨大的数字。

unsigned char c; 
printf("%u",c);

输出结果为:

  

21664

我不知道发生了什么事?

7 个答案:

答案 0 :(得分:3)

它有未定义的行为,因为a未初始化。

要打印字符的十进制值,您可以这样做 -

#include <stdio.h>

int main()
  {
         unsigned char a='A';
         printf("%d",a);
         return 0;
   }

这将打印ascii A 65的{​​{1}}值。

答案 1 :(得分:2)

修改为printf( "%u", (unsigned int)c )。否则printf将从堆栈中获取2个字节 - 一个具有c值,另一个具有随机字节。

答案 2 :(得分:2)

因为打印格式是%u是unsigned int,但c是unsigned char。 printf将c指向无符号的int点,程序读取未定义的缓冲区。

答案 3 :(得分:1)

使用错误的格式说明符会导致未定义的行为。

%u适用于unsigned int,不适用于unsigned char

答案 4 :(得分:1)

  

输出结果是:21664我不知道发生了什么事?

要打印该char的值,您必须为该char赋值,否则会得到未定义的行为。 如果你需要打印它的十进制值,只需使用%d(%u也可以在这里),因为CHAR也是一个INT

printf("The decimal value of CHAR is\t%d",c);

这也可以帮助您理解它:

    #include <stdio.h>

int main(void){
    unsigned char c = 'A';

    printf("The decimal value of CHAR is\t%d\n",c);
    printf("The decimal value of CHAR is\t%u\n",c);

    return 0;
}

输出:

The decimal value of CHAR is 65
The decimal value of CHAR is 65

答案 5 :(得分:1)

您的代码中没有任何错误。就打印结果的长度而言,它是打印unsigned int的值而不是unsigned char。因为格式说明符错误。该值应小于65535,它是。 顺便打印一个unsigned char使用格式说明符%h。 这将告诉编译器该变量的类型为unsigned short,并将为您完成工作。

答案 6 :(得分:0)

只需将您的unsigned char声明为

unsigned char ch=234;

并且您的printf将正常工作