70,024
社区成员




#include<stdio.h>
void main()
{
char c1,c2;
c1 = 197;
c2 = 198;
printf("c1 = %c,c2 = %c\n",c1,c2 );
printf("c1 = %d,c2 = %d",c1,c2);
return;
}
c1 = ?c2 = ?
c1 = -59,c2 = -58
想问一下返回的%d值是怎么计算的,观察的结果是
比如c1转2进制:11000101 然后首位1保留 其他的取补码 1 0111010
这样的结果计算出来是终端返回的结果,
想知道这样对吗?为什么会这么计算?
char c1, c2;
c1 = 197;
c2 = 198;
在这里,如果 char 等价于 unsigned char ,那么,在主流的机器上,它可以表示的数值范围是 0到255,所以能够容纳,且 printf 不可能打印两个负值。显然,在楼主的环境下,char实际上是signed char。在主流的机器上,它可以表示的数值范围是-127到+128,故无法表示 197 和 198 ,需要转换。
但是,如果新类型是有符号的并且无法表示这个值,转换的结果要依赖于具体的编译器,甚至可能触发信号机制。即,C语言没有规定如何转换。
在很多平台上(显然包括楼主所在的机器环境),是直接把长度为 int 的 197 截断为 char 类型的长度。所以,最终它表示有符号数-59。