0xffffffff在不同情况下的输出[通俗易懂]

0xffffffff在不同情况下的输出[通俗易懂]问题起源于next_random=next_random*(unsignedlonglong)25214903917+11;k1=(next_random&0xFFFF):保留next_random的低16位(最大65535);&0xFFFF引起了我的兴趣,发现这个的操作是取低16位。然后我百度了下。发现。low16=(unsigneds…

大家好,又见面了,我是你们的朋友全栈君。

问题起源于

next_random = next_random * (unsigned long long)25214903917 + 11;
k1 = (next_random & 0xFFFF):保留next_random的低16位(最大65535);

& 0xFFFF引起了我的兴趣,发现这个的操作是取低16位。然后我百度了下。
发现。

low16 = (unsigned short ) (number>>16); 
high16 = (unsigned short) (number&0xFFFF)

上式整体就是将number的低4字节分成两半,其中高的两字节存入low16,低的存入high16。
& 0xFFFF 是按位进行与计算,而0xffff转化为二进制为1111 1111 1111 1111进行计算后实际是取得number的低16位的值。
然后补充点关于0xffffffff与-1的关系。先看下面代码。

int main()
{ 
   
	unsigned int uint;
	int i = -1;
	uint = i;
	printf("%x %d\n", uint, i);
    //输出ffffffff -1
	uint = 0xffffffff;
	i = uint;
	printf("%x %d\n", uint, i);
    //输出ffffffff -1
    int j = -1;
    printf("%x\n", (~j));
    //输出0
    int k = 1;
    printf("%x\n", (~k));
    //输出0xfffffffe
    char c = 1;
    printf("%d\n", (~c));
    //输出-2

这里其实i在内存中是有符号的,我们知道内存中存储是补码,如果按uint读取,都是整数补码与原码相同。如果按照i读取,内存中的数值为补码表示,所以0xFFFFFFFF是一个负数的补码。负数从补码求原码,最高符号位不变,保持 1, 其余各位求反,末尾加1,也就是 0xFFFFFFFF,二进制为:11111111 11111111 11111111 11111111

->  10000000 00000000 00000000 00000000
->  10000000 00000000 00000000 00000001

再来看一个例子练习,~(-1),先将-1求补码,即1111 1111 1111 1111,然后取反0000 0000 0000 0000,即为0。

#include <stdio.h>
 
int main()
{ 
   
	unsigned int uint;
	int i = -1;
	uint = i;
	printf("%x %d\n", uint, i);
    //输出ffffffff -1
	uint = 0xffffffff;
	i = uint;
	printf("%x %d\n", uint, i);
    //输出ffffffff -1
    int j = -1;
    printf("%x\n", (~j));
    //输出0
    int k = 1;
    printf("%x\n", (~k));
    //输出0xfffffffe
    char c = 1;
    printf("%d\n", (~c));
    //输出-2

再附一个取反运算,这里要注意的是,数据的存储是反码格式,所以如果是负数的话,我们先要计算反码再取反。

int main()
{ 
   
    unsigned int uint;
    int i = -1;
    uint = i;
    printf("%x %d\n", uint, i);
    //输出ffffffff -1
    uint = 0xffffffff;
    i = uint;
    printf("%x %d\n", uint, i);
    //输出ffffffff -1
    int j = -1;
    printf("%x\n", (~j));
    //输出0
    int k = 1;
    printf("%d\n", (~k));
    //输出0xfffffffe
    char c = 1;
    printf("%d\n", (~c));
    printf("%x\n",(~c));
    //输出-2
}

参考
关于0xffffffff 到底是什么意思?
0xffffffff是多少?
C语言之-1与0xffffffff

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145326.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python2.7安装pytorch_PyTorch安装「建议收藏」

    python2.7安装pytorch_PyTorch安装「建议收藏」这个系列写了好几篇文章,这是相关文章的索引,仅供参考:以下是相关深度学习工具包的安装,包括Tensorflow,PyTorch,Torch等:首先安装libcupti-devsudoapt-getinstalllibcupti-dev然后用virtualenv方式安装Tensorflow(当前是1.4版本)sudoapt-getinstallpython-pippython…

    2022年6月24日
  • 你想要的Http和Https知识这里都有[通俗易懂]

    你想要的Http和Https知识这里都有[通俗易懂]你真的了解HTTP和HTTPS吗?HTTPS=SSL+HTTP,面试必问。

    2022年10月16日
  • 扫描系统漏洞的工具_免费漏洞扫描工具

    扫描系统漏洞的工具_免费漏洞扫描工具端口扫描之王NMAPNmap是一款非常强大的实用工具包含的功能如下:扫描到的端口状态:TCP扫描(-sT):这是一种最为普通的扫描方法,这种扫描方法的特点是:扫描的速度快,准确性高,对操作者没有权限上的要求,但是容易被防火墙和IDS(防入侵系统)发现运行的原理:通过建立TCP的三次握手连接来进行信息的传递SYN扫描(-sS):这是一种秘密的扫描方式之一,因为在SYN扫描中Client端和Server端没有形成3次握手,所以没有建立一个正常的TCP连接,因此不被防火墙和日志所记录…

    2022年9月12日
  • GPS数据包格式+数据解析[通俗易懂]

    GPS数据包格式+数据解析[通俗易懂]全球时区的划分:  每个时区跨15°经度。以0°经线为界向东向西各划出7.5°经度,作为0时区。即0时区的经度范围是7.5°W——7.5°E。从7.5°E与7.5°W分别向东、向西每15°经度划分为一个时区,直到东11区和西11区。东11区最东部的经度是172.5°E,由172.5°E——180°之间就是东12区。西11区最西部的经度是172.5°W,由172.5°W——180°之间就是西12区。东

    2022年6月29日
  • idea Mac 破解2021激活码[免费获取]

    (idea Mac 破解2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSWQi…

    2022年3月21日
  • VDbench 参数信息[通俗易懂]

    VDbench 参数信息[通俗易懂]HD:主机定义 如果您希望展示当前主机,则设置hd=localhost。如果希望指定一个远程主机,hd=label。 system=IP地址或网络名称。 clients=用于模拟服务器的正在运行的客户端数量。 SD:存储定义 sd=标识存储的名称。 host=存储所在的主机的ID。 lun=原始磁盘、磁带或文件系统的名称。vdbench也可为您创建一个磁盘。 threads=对SD的最大并发I/O请求数量。默认

    2022年5月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号