C语言的简单编程问题,希望大哥大姐指点,万分感谢

C语言代码为:
#include<stdio.h>
int main()
{
char c1,c2;
c1=197;
c2=198;
printf("c1=%c,c2=%c\n",c1,c2);
printf("c1=%d,c2=%d\n",c1,c2);
return 0;
}
输出结果为
c1=?c2=?
c1=-59,c2=-58
Press any key to continue
我知道在VC6.0中系统默认 char定义的字符取值范围为-128~127,我就是想问一下为什么会出现如上的运行结果?谢谢!

一、计算机中的整数是用补码来表示的 (补码是什么?请查询相关资料)
二、C中的整型常量默认为int类型,int类型是一个有符号类型(有符号类型和无符号类型请查询相关资料)
三、char类型数据在计算机中占一个字节,int类型占4个字节,char类型是一个有符号类型
四、197在计算机中存放的二进制码为:0000..... 11000101(int类型占4个字节,11000101前面有3*8=24个0)
同样198在计算机中存放的二进制码为:0000..... 11000110
五、 c1=197; c2=198;这两个赋值后,c1=11000101 c2=11000110 ,不同类型的数据在赋值时(大类型赋值给小类型),系统会自动截断高位,将低有效位赋值给小类型的变量
六、现在来看为什么输出是:printf("c1=%d,c2=%d\n",c1,c2); =》c1=-59,c2=-58
按%d来输出一个char变量,就是将变量的数值输出出来。
c1中存储的是 11000101,按有符号数解释就是-59 ,即:11000101是-59的补码
c2中存储的是 11000110,按有符号数解释就是-58 ,即:11000110是-58的补码

七、printf("c1=%c,c2=%c\n",c1,c2); =》c1=?c2=?
按%c来输出char变量,就是将变量所代表的字符输出出来
由于197(-59) 198(-58)不是一个有效的字符(ASCII),因些只能以?来代替。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-25
在内存中整数是以二进制形式存放的,即0和1
197转换为二进制后是 1 1 0 0 0 1 0 1
最大的有符号字符127的二进制为 1 1 1 1 1 1 1
注意这2个数的二进制位数,前者是8个字节,后者是7个字节。char在内存中是占一个位,即8个字节,从前面可以看出7个字节就表示出了最大的字符127,第8个(最左边那个)是符号位。1为负,0为正。这里197的二进制数
1 1000101转为char形式存放,最左边那位就变成了符号位,即表示负数。
因为内存中负数是以补码形式存放的,所以要进行按位取反在加1来表示
即刨去最左边的符号位1,剩下各位如下:
1000101
取反
0111010
转换成十进制是2+8+16+32=58
加1
59
再加上符号位-
-59
198楼主可以自行按上述计算得到-58
第2个回答  2011-10-25
把c1=197;
c2=198;改成c1=’197‘;
c2=‘198’;
就行了。追问

嗯,我知道你说的是输出那个ASCII代码,我就是问一下为什么会出现我的那个输出结果?不改

相似回答