永发信息网

C与C++中按位取反(~)的问题

答案:3  悬赏:30  手机版
解决时间 2021-04-13 11:04
  • 提问者网友:两耳就是菩提
  • 2021-04-12 23:01

#include<stdio.h>
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
int a;
short b;
long c;
unsigned short d;
unsigned e;
unsigned long f;
a=1;
b=1;
c=1;
d=1;
e=1;
f=1;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",~a,~b,~c,~d,~e,~f);
cout<<endl;
cout<<~a<<endl<<~b<<endl<<~c<<endl<<~d<<endl<<~e<<endl<<~f<<endl;
return 0;

}
夏雨(254838765) 15:58:40
结果是:

问题:

1、为什么两组输出的结果会不一样(即用prinft()输出的结果和用cout输出的结果会不一样);

2、为什么 cout<<d 的结果会是-2,而cout<<e、cout<<f的结果会是4294967294。

最佳答案
  • 五星知识达人网友:孤老序
  • 2021-04-12 23:29
1:用printf做格式化输出时,参数的类型不能决定输出的数值格式。
你在printf("%d\n%d\n%d\n%d\n%d\n%d\n",~a,~b,~c,~d,~e,~f);
中的d e f 均为无符号数值类型 所以输出的时候不能再用“%d”这个有符号整型转义符了
正确的输出方法如下
printf("%d\n%d\n%d\n%hu\n%lu\n%lu\n",~a,~b,~c,~d,~e,~f);
%hu 是无符短整型 %lu是无符长整型。因为unsigend long 和 unsigned int都是四字节,所以都用%lu表示。
修改程序代码后 输出的结果是:
-----------------------------------------------
-2
-2
-2
65534
4294967294
4294967294

-2
-2
-2
-2
4294967294
-------------------------------------------

4294967294
Press any key to continue

2:为什么 cout<<d 的结果会是-2
我个人认为是编译器对取反后的数值类型判断错误
这一点可以通过下列代码得到确认
unsigned short dd = ~d;
cout<<~a<<endl<<~b<<endl<<~c<<endl<<dd<<endl<<~e<<endl<<~f<<endl;

输出结果为:
---------------------------------------
-2
-2
-2
65534
4294967294
4294967294

-2
-2
-2
65534
4294967294
4294967294
Press any key to continue
---------------------------------------

如果想讨论为什么在cout下会出现类型判断错误,建议楼主在编译器下转入汇编模式进行调试跟踪或许会找到答案

全部回答
  • 1楼网友:酒安江南
  • 2021-04-13 00:25

1、printf输出取决的是格式化符合,这里都是%d,是有符合数,因此都是-2,而cout输出根据的是当前数据类型。所以会输出巨大的无符号数。

2、unsigned short d有一个隐式的类型转换,因为编译器是32位的,16位的数会转换成32位,这时候的结果跟编译器有关,这是不一样的原因。

  • 2楼网友:行雁书
  • 2021-04-12 23:46

short long 两者有数值范围-32768~32767 、-2147483648~2147483647

。。。。。。。。。。。。。。。

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯