分析下面的程序:
int main()
{
char c1;
char c2;
c1=97;
c2=98;
printf(“c1= %c,c2=%c\n”,c1 ,c2);
printf(“c1 =%d,c2=%d\n”, c1 ,c2);
return 0;
}
(1) 运行时会输出什么信息?为什么?
(2) 如果将程序第 3、4 行改为
c1=197; c2= 198 ;
运行时会输出什么信息?为什么?
(3) 如果将程序第 1、2 行改为
int c1, int c2;
运行时会输出什么信息?为什么?
①97对应的字符是‘a’,98对应的字符是’b’,所以按字符输出的结果就是a,b,按十进制数字输出的结果就是97,98
②char类型有一个字节,一个字节有8位二进制,所以有2^8=256个数字,范围从-127~ 0 ~128,所以c1=197,c2=198时,超过了范围,而197的二进制为1100 0101,198的二进制为1100 0110,而二进制1100 0101在char类型的二进制中表示-59,1100 0110的二进制表示为-58,负数没有对应的ASCII值,所以运行时显示的是问号(不是字符问号)
③int类型有4个字节,能表示的范围很大,
疑问:为什么int c1=197,c2=198 按字符输出不是字符???
解释:因为有的编译器只能显示0~127左右,这是标准的ASCII,而128 ~ 255是是扩展的 ASCII 码。每个编译器都有自己的字符集,用的不同的标准输出显示是不同的。
正数的二进制求解方法:所有位按权加起来
负数的二进制求解方法:所有位取反加一,包括符号位