| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1830 人关注过本帖
标题:关于位运算0求反输出-1
只看楼主 加入收藏
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
关于位运算0求反输出-1
程序代码:
#include<stdio.h>

int main(void)
{
    unsigned char a = 0;
    a = ~a;
    printf("%ld\n", a);
    return 0;
}

输出255

程序代码:
#include<stdio.h>

int main(void)
{
    unsigned short a = 0;
    a = ~a;
    printf("%ld\n", a);
    return 0;
}

输出65535
---------
上面都正确
但是
程序代码:
#include<stdio.h>

int main(void)
{
    unsigned int a = 0;
    a = ~a;
    printf("%d\n", a);
    printf("%ld\n", a);
    printf("%lld\n", a);
    return 0;
}

输出如下
图片附件: 游客没有浏览图片的权限,请 登录注册

这是为什么呢?
不是应该输出‭ 4294967295 ‬吗

[此贴子已经被作者于2017-2-23 21:01编辑过]

2017-02-23 14:07
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:5 
char a=0 即 a=0b00000000,取反就是 0b11111111 = -1
2017-02-23 14:19
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
这样比较看看
    char a=0;
    printf("%d %d", ~a, (unsigned char)~a);
2017-02-23 14:29
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:5 
%ld只能打出long型,你需要用%lld才行。long型的0xffffffff可不就是-1么
2017-02-23 14:43
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:5 
不,当我没说过,楼上已经说出了答案。

[此贴子已经被作者于2017-2-23 15:31编辑过]

2017-02-23 15:30
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 2楼 吹水佬
char a=0 即 a=0b00000000,取反就是 0b11111111 = -1
-----------------------------------------------------
我理解是unsigned char a=0 即 0000 0000,取反 是 1111 1111
对应10进制为255,输出是对的。

然后我把unsigned int a=0
输出改为了%lld,但是结果不对
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-02-23 16:08
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
这个稍微逻辑分析一下就知道原因了~因为int占4个bit~lld占八个bit~取反只对前面4个bit进行取反~但lld要输出前面8个bit~而后面4个bit的储存单元是未知的~所以输出数会有问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-23 16:25
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 7楼 九转星河
但是%d 或者 %ld 都是输出-1
2017-02-23 16:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 yanzy
6楼我先保留意见~看来lld数据储存方式不同ld(不仅仅是bit不同那么简单)~
下面是测试代码~

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a=0;

    printf("%lld\n",a);

    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-23 17:04
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
回复 6楼 yanzy
3楼已经有说法。
2017-02-23 19:55
快速回复:关于位运算0求反输出-1
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021011 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved