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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • APK 签名详解

    APK 签名详解1.签名的意义  为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的PackageName来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性。2.签名对你的App的影响。   你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的

    2022年6月5日
    80
  • pycharm svn设置_新手配置交换机详细教程

    pycharm svn设置_新手配置交换机详细教程1.打开pycharm设置配置svn.exe的地址Seting-versioncontrol-subversion按照红色填入svn.exe的路径2.在配置的时候找不到svn.exe的方法原因是在默认安装svn的时候忽略了安装svn.exe2.1在卸载或更改程序中重新安装一下svn2.2按照图片进行操作完成后需要重新打开pycharm设置,就可以找到svn.exe3.配置自动化脚本svn的地址导出的时候可以选择放置的位置如D盘4.注意事项pycharm的使用和本地使用没有太

    2022年8月25日
    6
  • tp框架中assign同时传递多个值,输出多个模板变量

    tp框架中assign同时传递多个值,输出多个模板变量

    2021年10月9日
    50
  • StretchDIBits 的使用

    StretchDIBits 的使用StretchDIBits 该函数将DIB中矩形区域内像素使用的颜色数据拷贝到指定的目标矩形中。如果目标矩形比源矩形大小要大,那么函数对颜色数据的行和列进行拉伸,以与目标矩形匹配。如果目标矩形大小要比源矩形小,那么该函数通过使用指定的光栅操作对行列进行压缩。参数:hdc:指向目标设备环境的句柄。XDest:指定目标矩形左上角位置的X轴坐标,按

    2022年6月23日
    30
  • 梯度下降法及其Python实现

    梯度下降法及其Python实现梯度下降法 gradientdesc 又名最速下降法 steepestdesc 是求解无约束最优化问题最常用的方法 它是一种迭代方法 每一步主要的操作是求解目标函数的梯度向量 将当前位置的负梯度方向作为搜索方向 因为在该方向上目标函数下降最快 这也是最速下降法名称的由来 梯度下降法特点 越接近目标值 步长越小 下降速度越慢 直观上来看如下图所示 这里每一个圈

    2025年6月11日
    2
  • Mysql : tinytext, text, mediumtext, longtext[通俗易懂]

    Mysql : tinytext, text, mediumtext, longtext[通俗易懂]Mysql:tinytext,text,mediumtext,longtext(2012-08-0114:26:23)转载▼标签:杂谈 分类:mysql一、数字类型类型 范围 说明 Char(N)[binary] N=1~255个字元binary:分辨大小写 固定长度 std_namecahr(32)…

    2022年8月13日
    4

发表回复

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

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