返回信息流int main()
{
char x=64;
x=x*2;
printf("%d\n",x);
x>>1;
printf("%d\n",x);
}
求输出和理由
这是一条镜像帖。来源:北邮人论坛 / cpp / #32126同步于 2009/11/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
一道面试题求解
leeyimm1
2009/11/25镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 leeyimm1 的大作中提到: 】
: int main()
: {
: char x=64;
: ...................
x 是signed .
第二次右移结果没赋给x, x不变
按最高位补齐,MS以前讨论过,
128=10000000,高位补齐后为不足整数的位全按最高位的1补成四个字节,
有一点是,计算机中一般存的是补码形式,需要进行补码和原码转换
至于x>>1这个对x的值没有影响
估计LZ写错了吧,可能是x>>=1吧,
那么结果就应该是-128和-64
【 在 leeyimm1 的大作中提到: 】
: int main()
: {
: char x=64;
: ...................
其实这道题的奥秘在于 %d 这个东西~~
在我的机器上(32位)验证了一下,两个都输出-128,第二个输出x没有变就不说了,下面是我的理解:
首先char表示一个有符号数,表示范围是-128~127;char x=64,x的二进制存储为0100 0000,最高位0是符号位。
x=x*2后,发生溢出,x的二进制存储为1000 0000,这个数的十进制表示就是-128,所以printf("%d\n",x)时会输出-128。
我今天看到一本书上说char型有可能是有符号整形,也有可能是无符号整形,到底怎么处理取决于编译器的实现
请问各位你们对char是有符号整形的判断是基于自己机器的输出呢还是标准文档的定义?