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

   更新日期:2024.05.19
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、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

  • 18933148614 :C与C++中按位取反(~)的问题
    竺晶霍3396 :答: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"...
  • 18933148614 :C语言中“~”按位取反~2的值为何是-3
    竺晶霍3396 :答:按位取反就是0换成1,1换成0.2的2进制是0000...0010,取反后就是1111...1101,就是-3.(ffff是-1,fffe是-2,fffd是-3)
  • 18933148614 :C语言,按位取反的时候怎么运算的!为什么~1的运算结果是﹣2_百度知 ...
    竺晶霍3396 :答:0000 0000 0000 0000 0000 0000 0000 0001 按位取反之后为 1111 1111 1111 1111 1111 1111 1111 1110 有符号的数最高位为1表示负数 负数的补码是其原码取反加1 取补码:1000 0000 0000 0000 0000 0000 0000 0010 结果为-2 -2的二进制为2的反码取补码:原码:0000 0000 0000 0000 0000 0000 ...
  • 18933148614 :C语言中的位逻辑运算符'~'是怎么取反的
    竺晶霍3396 :答:最高位表示符号位:0表示正数,1表示负数 补码转换为原码:除符号位之外 各位取反末位+1 .对于1 111111111111111111111111111101(32位系统int是32位的)除符号位之外按位取反末位+1 得到 1 000000000000000000000000000011 =-3 具体的补码很多书上都有介绍!
  • 18933148614 :C语言问题,按位与、按位或、按位异或、按位取反,解释下。
    竺晶霍3396 :答:1 | 1 = 1,1 | 0 = 1,0 | 1 = 1,0 | 0 = 0;异或运算,两者不同为真,反之为假:1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 1 = 1,0 ^ 0 = 0;取反运算,单目运算符:~1 = 0,~0 = 1;以上例子 1 代表真,0 代表假。按位运算就是将二进制位的每一位进行如上计算。...
  • 18933148614 :C语言位运算中取反问题,急。。。
    竺晶霍3396 :答:首先你输出是肯定用的 printf("%d",~a).int类型数据是有范围的 -32768~32767 [100]原=0000 0000 0110 0100 取反后为1111 1111 1001 1011 这个数值已远远超出了范围,发生溢出.但是这个数值是-101的补码,而计算机数字都是按补码存储的,所以他输出了-101.你放成ld,数值又不同....
  • 18933148614 :c语言中的位运算符中‘按位取反’是怎么运算的
    竺晶霍3396 :答:执行~运算,即~5后: 1111 1111 1111 1111 1111 1111 1111 1010,即结果为-6 以上过程没有任何问题,但如果忘记了负数的二进制表达方式,那么就会对这个结果产生疑问,为什么1111 1111 1111 1111 1111 1111 1111 1010表示-6,可能会以为它应该表示-10等等,所以,使用~按位取反的另一个关键就是理解...
  • 18933148614 :C语言问题,关于按位取反问题,大家看一下,这个~操作符。
    竺晶霍3396 :答:说到取反,还要设计到的一个东西就是数值的位长。在c语言中,整数有8位(char)、16位(short)、32位(long)等,常用的int在不同的编译环境下,可能是16位也可能是32位,具体的可以用printf("%d", sizeof(int) * 8);的方式确定int的位数。人工进行整数的位运算之前,首先要确定整数的位长,如...
  • 18933148614 :按位取反~(~1<<1)另外C语言负数按位取反是啥啊
    竺晶霍3396 :答:在C语言中,负数是以补码方式存放的,计算方法为,负数绝对值对应数值的二进制值,按位取反后再加一。当负数按位取反时,就是其补码按位取反。比如,-10在存储为char型时,10的二进制值为0000 1010,取反后为1111 0101, 加一得到补码的二进制值为 1111 0110, 所以-10在存为char型时,补码的16...
  • 18933148614 :c语言,按位取反。
    竺晶霍3396 :答:C语言的逻辑运算包括与、或、非 按位取反使用运算符~如0xFF按位取反为~(0xFF)按位取反后的结果为0x00 需要注意的是,C语言中的逻辑运算&和&&是不同的 0xFF&0xA0=0xA0 而0xFF&&0xA0=1 一个运算符是按位操作 其返回值是按位操作的结果 两个运算符是逻辑表达式,其返回值只有0和1 ...
  • 相关链接

    欢迎反馈与建议,请联系电邮
    2024 © 视觉网