拈花小仙 发表于 2014-4-9 22:18:33

关于按位取反的问题

本帖最后由 拈花小仙 于 2014-4-10 00:41 编辑

#include <stdio.h>
int main()
{
    int i = ~3;         //   3的二进制表示为 0000 0000 0000....11   取反后因为1111 1111 1111..00。
    printf("%d",i);   // 可输出的数字是1111 1111...00 取反在1的结果,而不是11111..00,这是为什么?
    return 0;
}

1111 1111 1111 1111 1111 1111 1111 1100 换算成十进制是4294967292
把1111 1111 1111 1111 1111 1111 1111 1100 取反在+1才是 -4

machimilk 发表于 2014-4-9 22:18:34

本帖最后由 machimilk 于 2014-4-9 22:53 编辑

32位操作系统 3的二进制是 0000 0000 0000 0000 0000 0000 0000 0011
取反后是                            1111 1111 1111 1111 1111 1111 1111 1100
换成10机制是-4 有什么不对的吗?
二进制从0开始 0的取反不会是0而是-1
那么0 取反为-1
       1 取反为-2
       2 取反为-3
       3 取反为-4
不明白你说的+1是什么概念

拈花小仙 发表于 2014-4-9 23:23:16

machimilk 发表于 2014-4-9 22:49 static/image/common/back.gif
32位操作系统 3的二进制是 0000 0000 0000 0000 0000 0000 0000 0011
取反后是                           ...

1111 1111 1111 1111 1111 1111 1111 1100 换算成十进制是4294967292
把1111 1111 1111 1111 1111 1111 1111 1100 取反在+1才是 -4

machimilk 发表于 2014-4-10 00:23:11

本帖最后由 machimilk 于 2014-4-10 00:30 编辑

拈花小仙 发表于 2014-4-9 23:23 static/image/common/back.gif
1111 1111 1111 1111 1111 1111 1111 1100 换算成十进制是4294967292
把1111 1111 1111 1111 1111 1111...
你确定你是32位4字节(双字)操作的???????
字节=byte 1字节 8位
字=word 2字节 16位
双字=dword 4字节 32位
4字=qword 8字节 64位
看图对比一下





拈花小仙 发表于 2014-4-10 00:40:37

machimilk 发表于 2014-4-10 00:23 static/image/common/back.gif
你确定你是32位4字节(双字)操作的???????
字节=byte 1字节 8位
字=word 2字节 16位


哦哦,我用的操作系统,CPU,编译工具全是64位的,可输出的还是32位,是为了兼容吗?还是因为64位数一般用不到,所以默认以32位输出呢

machimilk 发表于 2014-4-10 01:28:54

拈花小仙 发表于 2014-4-10 00:40 static/image/common/back.gif
哦哦,我用的操作系统,CPU,编译工具全是64位的,可输出的还是32位,是为了兼容吗?还是因为64位数一般用 ...

因为你定义的int形式 关于int在你64位系统里面到底是多少字节 用 sizeof(int)算算,就知道64位系统的int到底是不是按4字节了

oggplay 发表于 2014-4-10 15:45:02

printf("%u",i);//试试这个

lansesl2008 发表于 2014-4-12 23:11:00

页: [1]
查看完整版本: 关于按位取反的问题