将两位数字打印为字符

时间:2015-01-16 10:33:33

标签: c printf character ascii

我有这行代码:

printf("%c\n", '65');

此代码将5打印到控制台。

我知道65不是有效字符,并且没有分配给任何ASCII值,那么这个输出背后的原因是什么?

5 个答案:

答案 0 :(得分:5)

单引号给出字符的ascii值,称为字符常量

printf("%c\n", '65');

multicharacter constant,这是实现定义的

65'A'字符的ascii值,所以我想你的意思是

printf("%c\n", 'A');

相当于

printf("%c\n", 65);

使用多字符字符常量,是实现定义的。例如gcc

  

编译器一次评估一个字符的多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到宽度的新字符的位模式中一个目标角色。最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的(与版本3.1及更早版本的GCC略有不同)。如果常量中的字符数多于目标int中的符号,则编译器会发出警告,并忽略多余的前导字符。

     

例如,对于具有8位字符的目标,'ab'将被解释为“(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')”,而“\234a”将被解释为“(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')”。

     

Reference

所以在gcc中你会得到5,因为

printf("%c\n", '65');

等同于

printf("%c\n", (int)(((unsigned char)'6' * 256) | (unsigned char)'5'));

最后从问题的标题来看,似乎你想要

printf("%d\n", 65);

即。打印小数值65

答案 1 :(得分:0)

%c仅打印一个字符。 %s打印一个字符串。

所以试试这个:

printf("%s\n", "65");

来源:http://www.cplusplus.com/reference/cstdio/printf/

编辑:如果65是一个字符的十进制数,那么写下:

printf("%c\n", 65);

答案 2 :(得分:0)

我们知道char的大小是8位。在这里,您尝试使用%c打印'65'。 %c会寻找打印8位。 '65'是16位: Ascii值为6为54,二进制为00110110,5的为00110101 所以问题是“%c将打印前8位或后8位”。 那么,这取决于您的系统是使用Little Endian还是Big Endian。 Big Endian是直接的,并将'54'存储为00110110 00110101.但Little Endian首先存储LSB,然后存储MSB即00110101 00110110.看起来您的系统支持Little endian,因此%c采用前8位,即00110101,即5

答案 3 :(得分:0)

由于角色只占用1个字节的内存,因此每当您以字符格式(即%c)打印超过1个字节的任何内容时,编译器会打印其低8位(即1个字节)和放大器;丢弃了所有其他位。

答案 4 :(得分:-1)

我必须像您一样分配两位数字作为字符。当我搜索打印两位数的数字时,只有帖子是您的帖子。因此,我在这里写。

我写了一个对所有人都有帮助的函数。

void setElementID(char* name,int count){
    int len = strlen(name);
    char buffer[5];
    int n = sprintf(buffer,"%d",count);
    printf("%s",buffer);
    for(int i=0;i<n;i++){
         name[len] = buffer[i];
         len++;
    }
    name[len+n]='\0';
}

我认为这可以解决您的问题。

此功能将生成所需数量的客户端ID。您只需持有count变量,并在必要时将其递增。

如果只想打印数字,则只需打开
字符数字[10];
,然后将其与计数器一起使用即可。

我的推荐人:http://www.cplusplus.com/reference/cstdio/sprintf/