C与C++中按位取反(~)的问题
#include<stdio.h>#include<iostream>usingstd::cout;usingstd::cin;usingstd::endl;intmai...
#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。 展开
#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。 展开
2014-03-04
展开全部
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下会出现类型判断错误,建议楼主在编译器下转入汇编模式进行调试跟踪或许会找到答案
你在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下会出现类型判断错误,建议楼主在编译器下转入汇编模式进行调试跟踪或许会找到答案
2014-03-04
展开全部
1、printf输出取决的是格式化符合,这里都是%d,是有符合数,因此都是-2,而cout输出根据的是当前数据类型。所以会输出巨大的无符号数。2、unsigned short d有一个隐式的类型转换,因为编译器是32位的,16位的数会转换成32位,这时候的结果跟编译器有关,这是不一样的原因。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言按位取反运算符~
注意:C语言的按位取反运算,对于符号位同样取反:如
C语言~12 按位取反的结果 是什么?
short 型为例 12的二进制为0000 1100
取反便成了。1111 0011
而这个数用带符号的整形(%d打印出)表示为-13
------------------------
负数的绝对值等于: 取反 + 1
1111 0011 取反加1为0000 1101 = 13
所以为-13
最高位为符号位
-----------------------------------
printf("%x,%d\n",~7,~7);//输出:fffffff8,-8
注意:C语言的按位取反运算,对于符号位同样取反:如
C语言~12 按位取反的结果 是什么?
short 型为例 12的二进制为0000 1100
取反便成了。1111 0011
而这个数用带符号的整形(%d打印出)表示为-13
------------------------
负数的绝对值等于: 取反 + 1
1111 0011 取反加1为0000 1101 = 13
所以为-13
最高位为符号位
-----------------------------------
printf("%x,%d\n",~7,~7);//输出:fffffff8,-8
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询