这似乎是一个相当大的话题。例如,如果您尝试将-ve float转换(转换)为+ ve unsigned int,则它不起作用。所以我现在正在阅读有关两个补码,促销和位模式,以及如何转换/处理-ve到+ ve float /整数。例如,在VS 2010的示例中,x保持为-1。
float x = -1;
(unsigned int)y = (unsigned int)x;
printf("y:%u", y);
那么负位整数在位模式方面存储在存储器中的确切程度如何,C ++中有哪些选项可用于转换它们,你可以通过位移来实现这一点,这是最好的方法。
答案 0 :(得分:3)
那么在位模式方面,负整数究竟是如何存储在存储器中的
为了更好地理解负整数值的表示,请使用以下code来使用它:
#include <iostream>
#include <bitset>
#include <cstdint>
void printBitWise(std::ostream& os, uint8_t* data, size_t size) {
for(size_t i = 0; i < size; ++i) {
for(uint8_t j = 0; j < 8; ++j) {
if((data[i] >> j) & 1) {
os << '1';
}
else {
os << '0';
}
}
}
}
int main() {
int x = -1;
std::bitset<sizeof(int) * 8> bitwise1(x);
std::cout << bitwise1.to_string() << std::endl;
int y = -2;
std::bitset<sizeof(int) * 8> bitwise2(y);
std::cout << bitwise2.to_string() << std::endl;
float a = -1;
printBitWise(std::cout,reinterpret_cast<uint8_t*>(&a),sizeof(float));
std::cout << std::endl;
double b = -1;
printBitWise(std::cout,reinterpret_cast<uint8_t*>(&b),sizeof(double));
std::cout << std::endl;
float c = -2;
printBitWise(std::cout,reinterpret_cast<uint8_t*>(&c),sizeof(float));
std::cout << std::endl;
double d = -2;
printBitWise(std::cout,reinterpret_cast<uint8_t*>(&d),sizeof(double));
std::cout << std::endl;
return 0;
}
输出:
11111111111111111111111111111111
11111111111111111111111111111110
00000000000000000000000111111101
0000000000000000000000000000000000000000000000000000111111111101
00000000000000000000000000000011
0000000000000000000000000000000000000000000000000000000000000011
float
和double
值的位格式是另一回事。它用IEEE floating point format描述,可能是特定行为的编译器实现(例如'舍入规则'或'操作')。
答案 1 :(得分:0)
在你的程序中,变量x是float类型。机器需要将其转换为整数类型。对于intel处理器,指令是&#34; cvttss2si&#34;。请检查http://en.wikipedia.org/wiki/Single-precision_floating-point_format以查看以二进制格式表示float的方式。
对于你给出的代码snippt,我测试了g ++和VS 2013.两者都按预期工作并打印&#34; y:-1&#34;。
#include <cstdio>
int main()
{
float x = -1;
unsigned int y;
y = (unsigned int)x;
printf("y:%d", y);
return 0;
}
但是,在这个程序中,编译器为我们执行float到整数转换。
movl $-1, %eax
movl %eax, -12(%rbp)
movl -12(%rbp), %esi
movb $0, %al
callq _printf
以下示例程序可以揭示机器如何进行浮动到整数转换:
#include <cstdio>
int main()
{
float x ;
scanf("%f", &x);
unsigned int y;
y = (unsigned int)x;
printf("y:%d", y);
return 0;
}
这是程序集显示cvttss2si执行float到整数转换工作(http://www.jaist.ac.jp/iscenter-new/mpc/altix/altixdata/opt/intel/vtune/doc/users_guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/mergedProjects/instructions/instruct32_hh/vc68.htm)。
cvttss2si -8(%rbp), %rsi
movl %esi, %ecx
movl %ecx, -12(%rbp)
movl -12(%rbp), %esi
movq -24(%rbp), %rdi ## 8-byte Reload
movl %eax, -28(%rbp) ## 4-byte Spill
movb $0, %al
callq _printf
答案 2 :(得分:0)
在许多平台上,数字的符号由保留位表示。
使用2的补码整数,最高有效位(MSB)表示符号,当设置值为负时,当清除时,值为正。但是,设置该位可能无法正确地将值从正转换为负。
在许多浮点格式中,有一点保留用于指示数字的符号。您必须研究各种浮点标准格式,尤其是您的平台和编译器使用的格式。
从负数转换为正数的最佳和最便携的方法是使用abs
系列函数。请记住,这是签名数据类型。
要从正转换为负,请乘以-1或-1.0。
未为无符号类型定义负数。