我有这行代码:
printf("%c\n", '65');
此代码将5
打印到控制台。
我知道65
不是有效字符,并且没有分配给任何ASCII值,那么这个输出背后的原因是什么?
答案 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')
”。
所以在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];
,然后将其与计数器一起使用即可。