
摘要:本调试内容均在Turboc2.0环境下运行过。本机器int 为2字节,char型为1字节,char有符号时表示的整型范围是-128~127。需要注意的是:整型数据在内存中是以补码形式存储的。另外如果按%d输出,那么补码中最高位的1就变成符号位(重要)了,1代表负数,而负数是以补码存放的,转换成原码输出,%u而%u是无符号输出,最高那一位不当作符号位(同等重要)。[注意文中分段]
第一部分(存储形式)
Case1: char为有符号型时(前8位写满倒数第8位的符号位)
Case2:char为无符号型时(前8位写满0)
第二部分
Case1:当以%d输出时,有两种方法:
法1:如上表char型数据在内存中的表示形式,%d依据补码进行转换输出:
例1:{
char a=472;
printf(“%d\\n”,a);
} //结果为 -40
例2:{
unsigned char a=472;
printf(“%d\\n”,a);
}//结果为 216
依然要注意:{
unsigned char a=-150;
printf(“%d,”,a);
printf("%c",a);
} //结果为 106,j 就是说输出%c时截取存储时的低八位就行。
【补充的深层理解】 例3: {
char a=128;
printf(“%d\\n”,a-3);
} //结果为 -131
解释:可以看出当以%d输出时,是
a的存储 1111 1111 1000 0000
+ 1111 1111 1111 1101 (-3的补码)
= 1111 1111 0111 1101 故为 - 131
例4 :{
char a=128;
printf(“%c\\n”,a-3);
} //结果为 } (125对应的符号为 })
解释:可以看出当以%c输出时,是
以a的存储低字节 1000 0000
+ 1111 1101 (-3的补码)
= 0111 0011 故为125
法2:注意:一个整型类型的变量,用任何一个超过表示范围的整数初始化,得到的值为用该整数范围作模运算后的值。
根据上图,如上例1,结果为472-2*256(模)= - 40;(为何-40,要在有符号的-128~127内)
根据上图,如上例2,结果为472-256(模)=216;(同理,要在0~255内)
*延伸:
{
int a=426;
printf(“%d”,a);
}//结果为 426-65536(模)= - 220(在范围内)
Case2:当以%u输出时,只有一种方法:
如上表char型数据在内存中的表示形式,%u依据补码进行直接输出:
例5:{
char a=472;
printf(“%u\\n”,a);
} //结果为 65496
--安徽工业大学工商学院--刘伟伟
2013年7月
