C++中取反 的问题
1:用printf做格式化输出时,参数的类型不能决定输出的数值格式。
你在printf("%d
%d
%d
%d
%d
%d
",~a,~b,~c,~d,~e,~f);
中的d e f 均为无符号数值类型 所以输出的时候不能再用“%d”这个有符号整型转义符了
正确的输出方法如下
printf("%d
%d
%d
%hu
%lu
%lu
",~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下会出现类型判断错误,建议楼主在编译器下转入汇编模式进行调试跟踪或许会找到答案
C语言_084_取反运算
但是第一位是符号位,0表示正数,1表示负数。
下面就是反过来求原码的过程:
111111111111111111111111111111111 中,第一位是1,是负数
后边的
11111111111111111111111111111111里边,是补码表示的数字。
最后一位先减去1,就是:
11111111111111111111111111111110
再全部取反:
00000000000000000000000000000001 就是1;
又因为是负数,所以是-1.
1、这是计算机原理的内容。
2、所有整数都是以所谓补码存放的。而且内存中的第一位表示符号:1为负,0为正。
3、具体补码可以自己搜索知识。
0取反绝对是0xffffffff
错在你用十进制查看了,这样一来需要把二进制转换成十进制。
换成十六进制查看试试
C语言_084_取反运算
屠以诺和: -11 ~10表示10对应的二进制按位取反,取反后刚好是-11的补码. 在计算机中,整数一般用16位或者32位二进制表示,假设用16位,10 在计算机中的表示就是: 0000 0000 0000 1010 按位取反就是 1111 1111 1111 0101 ---->这个就是-11的补码. ~是按位取反操作符,操作步骤:一、10装换为而二进制 [00001010]二、每一位取反,0变换为1,1变换为0得 [11110101]
阿拉善右旗19462682051: c++ 实现某一int的某一位置取反 - ?
屠以诺和: 很简单的,a是个小数的话点后面有数据(3.000)浮点型取整就是要将点后面的都去掉,把它强制转换为3,可以这样写(int)a 这个时候a就为3但是这样是有风险的,比如a的值为3.2545,那么你强制转换为int,a点后面的数就都被消灭了就是这样 答案补充 这个里面可没有什么四舍五入哦!!!3.56不会强制转换为4,还是3
阿拉善右旗19462682051: C++中,对字节、字、双字进行内部位取反操作是在变量前面使用~符号. - ?
屠以诺和: 那要看你“取反”是什么意思.如果是“按位反”,当然就是~,如果是逻辑反,自然是!.bool就两个值:1和0,亦即true和false.bool值1或true的按位反是-2而不是0,0亦即false的按位反是-1而不是1.只有:逻辑反",才是1<-->0.
阿拉善右旗19462682051: c++问题 为什么a取反不是一个很大的负数 - ?
屠以诺和: 在计算机中数字以补码的方式存储 例如a=13 转换为原码a=(00001101)原 一个正数的补码和原码相同 a=(00001101)补 取反,设c=~a 则c=(11110010)补 最高位,第八位为1,说明c是一个负数,负数补码转换为原码需要取反(符号位除外)再加1 ∴c=(11110010)补=(10001101)=(10001110)原 即c=-14 在C语言中使用的是原码,而存储的是补码
阿拉善右旗19462682051: C++中按位与按位或还有异或左移位右移位还有取反都是用什么计算方法的 - ?
屠以诺和: 左移向左移几位就用它和几个2相乘,右移同理.取反就是它一你就二,它二你就一
阿拉善右旗19462682051: 求C++写将一串16进制双位取反算法函数 - ?
屠以诺和: #include <iostream> using namespace std; int f(int a){ int mark = 0xff, r = 0; for(int i=0; i<sizeof(a); i++){ r <<= 8; r |= a&mark; a >>= 8; } return r; } int main(){ int a = 0x45F0EA31; cout << hex << uppercase << f(a); }
阿拉善右旗19462682051: VC++这个取反的函数怎么理解 - ?
屠以诺和: MID的作用是从字符串中某个字符(位置)开始取多少个字符 m_input.Mid(1,m_input.GetLength()); 就是从m_input的第2个字符开始取到最后
阿拉善右旗19462682051: 求问C++中位求反~这个符号 为什么会不会取反 - ?
屠以诺和: 这个是按位取反,0变1,1变0,最终结果跟数据类型也有关系,不知道你的代码是什么?
阿拉善右旗19462682051: 按位与、按位异或、按位取反各是什么意思?C++ - ?
屠以诺和: 就是先把数都转换为2进制按题目要求运算1为真0为假与就是两数相与全是真的时候结果为真其他全为假,取反就是去相反的意思呀,真是为假、假时为真,异或就是两个个数比较真异或假时为真,假异或真时为真,真异或真时为假,假异或假时为假.就是相同为假,相反为真.
阿拉善右旗19462682051: C++中的按位求异或 - ?
屠以诺和: ^是异或,每对相对位,相异则返回1,相同返回0 所以无论a为何值,a^a永远是0 补充一下,想把0变成1的符号是~按位取反,是单目运算符,用法a=~a而不是a~=a