0xffffffff在不同情况下的输出

您所在的位置:网站首页 0xffff是多少转化成二进制 0xffffffff在不同情况下的输出

0xffffffff在不同情况下的输出

2024-06-06 08:28| 来源: 网络整理| 查看: 265

问题起源于

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 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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3