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


相关推荐

  • sql 聚合语句,count的用法「建议收藏」

    sql 聚合语句,count的用法「建议收藏」如要获取result='1'的数量COUNT(CASEWHENresult='1'THENresultEND)SELECT*FROM(

    2022年7月2日
    32
  • sin的傅里叶变换公式_傅里叶变换的由来及复数下的傅里叶变换公式证明

    sin的傅里叶变换公式_傅里叶变换的由来及复数下的傅里叶变换公式证明1、考虑到一个函数可以展开成一个多项式的和,可惜多项式并不能直观的表示周期函数,由于正余弦函数是周期函数,可以考虑任意一个周期函数能否表示成为一系列正余弦函数的和。假设可以,不失一般性,于是得到:f(t)=A0+∑(n=1,∞)Ansin(nωt+Φn)2、将后面的正弦函数展开:Ansin(nωt+Φn)=AnsinΦncosnωt+AncosΦnsinnωt令a0/2=A0,an…

    2022年7月17日
    18
  • c语言函数使用的三个步骤,sqrt函数怎么使用 C语言中的sqrt函数使用方法介绍

    c语言函数使用的三个步骤,sqrt函数怎么使用 C语言中的sqrt函数使用方法介绍sqrt函数是什么函数?sqrt函数怎么使用呢?对于这两个问题,相信这是很多第一次看到该函数人最先想到的问题,当然这两个问题也是了解该函数最主要的方面。因此今天小编就来说一说在c语言当中sqrt函数是如何使用的。sqrt函数怎么使用——C语言中sqrt函数的使用方法C语言中sqrt函数是指的开方运算函数,得到的结果是函数变量(可以是数值,也可以是变量名)的算术平方根。在VC6.0中的math.h头…

    2022年5月1日
    132
  • stardict and dictionaries

    stardict and dictionaries

    2021年5月3日
    162
  • keil如何生成bin文件_ccs6如何生成bin文件

    keil如何生成bin文件_ccs6如何生成bin文件在RVMDK中,默认情况下生成*.hex的可执行文件,但是当我们要生成*.bin的可执行文件时怎么办呢?答案是可以使用RVCT的fromelf.exe工具进行转换。也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*.axf格式的文件转换成*.bin格式的文件。         下面将具体说明这个操作步骤:

    2022年10月20日
    3
  • show partitions 分区查询

    show partitions 分区查询前言查询的分区情况程序Jupyter#导入信息frompyspark.sqlimportSparkSession,RowfrompysparkimportSQLContextfrompyspark.sql.functionsimportudf,col,explode,collect_set,get_json_object,concat_ws,splitfrompyspark.sql.typesimportStringType,IntegerTy

    2022年6月26日
    55

发表回复

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

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