问题起源于
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
今天的文章0xffffffff在不同情况下的输出分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/5235.html