C++ 浮动的右移

C++ 浮动的右移,c++,bit-shift,C++,Bit Shift,我有过这样的经历 float f = 0b 00000000 11110001 00000000 00000000 我想将第一个(不是第0个)字节转换为字符变量。 我做不到>。 我该怎么做 char bla; bla = *((char *) &f + 1) 还请记住,对于endianness,在小endian系统中,您可能实际需要的是字节2(假设您将字节数从0到3)。在这种情况下,您可以将上述代码中的+1更改为+2 还请记住,对于endianness,在小endian系统中,您可

我有过这样的经历

float f = 0b 00000000 11110001 00000000 00000000 
我想将第一个(不是第0个)字节转换为字符变量。 我做不到>。 我该怎么做

char bla;
bla = *((char *) &f + 1)
还请记住,对于endianness,在小endian系统中,您可能实际需要的是字节2(假设您将字节数从0到3)。在这种情况下,您可以将上述代码中的
+1
更改为
+2


还请记住,对于endianness,在小endian系统中,您可能实际需要的是字节2(假设您将字节数从0到3)。在这种情况下,您可以在上面的代码中将
+1
更改为
+2

浮点值的二进制表示通常很少有点混乱。任何你想尝试的东西都不能随身携带。但是,一般来说,这两种方法都有效:

char c(reinterpret_cast<char*>(&f)[1]);
union {
    float f;
    char  c[sizeof(float)];
} u = { f };
u.c[1];
charc(重新解释演员阵容[1]);
联合{
浮动f;
炭c[sizeof(float)];
}u={f};
u、 c[1];

浮点值的二进制表示通常很少有点混乱。任何你想尝试的东西都不能随身携带。但是,一般来说,这两种方法都有效:

char c(reinterpret_cast<char*>(&f)[1]);
union {
    float f;
    char  c[sizeof(float)];
} u = { f };
u.c[1];
charc(重新解释演员阵容[1]);
联合{
浮动f;
炭c[sizeof(float)];
}u={f};
u、 c[1];


需要注意的是,此代码取决于平台的端度。此配方的工作原理非常奇怪,我有float=1,使用…+1或+2我可以得到63或-128@AntonyTren金:在让wonder压倒你之前,你真的需要对IEEE754浮点表示法有一点了解。应该注意的是,这段代码取决于平台的端性。这个方法非常奇怪,我有float=1,使用…+1或+2我可以得到63或-128@AntonyTren金:在让奇迹压倒你之前,你真的需要对IEEE754浮点表示法有一点了解;字符c=0;c=*((字符*)(&m)+1);难道我没有电脑可以快速测试,但0b111。。。是一个不能精确表示为浮点的整数。我现在还不知道这个表达式看起来如何,但很可能它被四舍五入到了2的最接近的幂。这将用所有的零来表示(前导1是隐式的),但指数除外,它将是
32-bias
(也不知道float的bis off-hand)。@KerrekSB:我认为访问一个无序的并集是未指定的。诚然,我没有太多关注这些东西是否在改变,但我找不到标准中的一句话来支持这两种说法:你能给我指一下描述这一点的部分吗?@DietmarKühl:从9.5开始,工会以某种迂回的方式出现了:在任何时候,最多有一名成员可以活跃,“工会的行为就像我们是唯一的成员一样。”@KerrekSB:我看到了这句话,但从我的观察来看,这并不意味着没有定义的行为。我很确定,在C++2003中,有很多代码使用这种
union
方法在类型之间进行转换,例如在标量类型数组和相应类型的SIMD值之间进行转换;字符c=0;c=*((字符*)(&m)+1);难道我没有电脑可以快速测试,但0b111。。。是一个不能精确表示为浮点的整数。我现在还不知道这个表达式看起来如何,但很可能它被四舍五入到了2的最接近的幂。这将用所有的零来表示(前导1是隐式的),但指数除外,它将是
32-bias
(也不知道float的bis off-hand)。@KerrekSB:我认为访问一个无序的并集是未指定的。诚然,我没有太多关注这些东西是否在改变,但我找不到标准中的一句话来支持这两种说法:你能给我指一下描述这一点的部分吗?@DietmarKühl:从9.5开始,工会以某种迂回的方式出现了:在任何时候,最多有一名成员可以活跃,“工会的行为就像我们是唯一的成员一样。”@KerrekSB:我看到了这句话,但从我的观察来看,这并不意味着没有定义的行为。我敢肯定,在C++2003中,有很多代码使用这种
union
方法在类型之间进行转换,例如在标量类型数组和相应类型的SIMD值之间进行转换。与浮点数的移位无关:我猜“0b…”是一个二元积分常数。我不能肯定,因为它似乎不是C++的一部分。但是,如果是这样,请不要让浮点变量中存储的位模式不同。通常,浮点数是用IEEE-754(或类似的东西)表示的,位模式会将所有位上移,切掉前导的[隐式]数字,并添加一个指数。我真的怀疑你想做的是你想做的…独立于浮点数的移位:我猜“0b…”是一个二进制积分常数。我不能肯定,因为它似乎不是C++的一部分。但是,如果是这样,请不要让浮点变量中存储的位模式不同。通常,浮点数是用IEEE-754(或类似的东西)表示的,位模式会将所有位上移,切掉前导的[隐式]数字,并添加一个指数。我真的怀疑你想做的是你想做的。。。