C++ 理解负数并将其转换
这似乎是一个相当大的话题。例如,如果您尝试将-ve浮点转换为+ve unsigned int,则无法工作。所以我现在正在阅读关于二的补码,提升和位模式,以及如何将-ve转换为+ve浮点/整数。例如,在VS 2010的示例中,x保持为-1C++ 理解负数并将其转换,c++,bit-manipulation,unsigned,C++,Bit Manipulation,Unsigned,这似乎是一个相当大的话题。例如,如果您尝试将-ve浮点转换为+ve unsigned int,则无法工作。所以我现在正在阅读关于二的补码,提升和位模式,以及如何将-ve转换为+ve浮点/整数。例如,在VS 2010的示例中,x保持为-1 float x = -1; (unsigned int)y = (unsigned int)x; printf("y:%u", y); P> >在内存中,负整数如何以位模式存储,C++中有哪些选项可以转换它们,你能通过位移位来完成这一点吗?什么是最好的方法。
float x = -1;
(unsigned int)y = (unsigned int)x;
printf("y:%u", y);
P> >在内存中,负整数如何以位模式存储,C++中有哪些选项可以转换它们,你能通过位移位来完成这一点吗?什么是最好的方法。
在你的程序中,变量X是浮点型的。机器需要将其转换为整数类型。对于英特尔处理器,指令为“cvttss2si”。请检查浮动是如何以二进制格式表示的
对于您发布的代码snippt,我使用g++和VS2013进行了测试。两者都按预期工作,并打印“y:-1” 以下示例程序可以显示机器如何进行浮点到整数的转换:#include <cstdio>
int main()
{
float x ;
scanf("%f", &x);
unsigned int y;
y = (unsigned int)x;
printf("y:%d", y);
return 0;
}
在您的程序中,变量x是浮点型的。机器需要将其转换为整数类型。对于英特尔处理器,指令为“cvttss2si”。请检查浮动是如何以二进制格式表示的 对于您发布的代码snippt,我使用g++和VS2013进行了测试。两者都按预期工作,并打印“y:-1” 以下示例程序可以显示机器如何进行浮点到整数的转换:
#include <cstdio>
int main()
{
float x ;
scanf("%f", &x);
unsigned int y;
y = (unsigned int)x;
printf("y:%d", y);
return 0;
}
在您的程序中,变量x是浮点型的。机器需要将其转换为整数类型。对于英特尔处理器,指令为“cvttss2si”。请检查浮动是如何以二进制格式表示的 对于您发布的代码snippt,我使用g++和VS2013进行了测试。两者都按预期工作,并打印“y:-1” 以下示例程序可以显示机器如何进行浮点到整数的转换:
#include <cstdio>
int main()
{
float x ;
scanf("%f", &x);
unsigned int y;
y = (unsigned int)x;
printf("y:%d", y);
return 0;
}
在您的程序中,变量x是浮点型的。机器需要将其转换为整数类型。对于英特尔处理器,指令为“cvttss2si”。请检查浮动是如何以二进制格式表示的 对于您发布的代码snippt,我使用g++和VS2013进行了测试。两者都按预期工作,并打印“y:-1” 以下示例程序可以显示机器如何进行浮点到整数的转换:
#include <cstdio>
int main()
{
float x ;
scanf("%f", &x);
unsigned int y;
y = (unsigned int)x;
printf("y:%d", y);
return 0;
}
那么负整数究竟是如何以位模式存储在内存中的呢
要更好地理解负整数值的表示形式,请使用以下方法:
#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;
}
float
和double
值的位格式是不同的。它是用描述的,并且可能是特定于特定行为(例如“舍入规则”或“操作”)的编译器实现
那么负整数究竟是如何以位模式存储在内存中的呢
要更好地理解负整数值的表示形式,请使用以下方法:
#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;
}
float
和double
值的位格式是不同的。它是用描述的,并且可能是特定于特定行为(例如“舍入规则”或“操作”)的编译器实现
那么负整数究竟是如何以位模式存储在内存中的呢
要更好地理解负整数值的表示形式,请使用以下方法:
#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;
}
float
和double
值的位格式是不同的。它是用描述的,并且可能是特定于特定行为(例如“舍入规则”或“操作”)的编译器实现
那么负整数究竟是如何以位模式存储在内存中的呢
要更好地理解负整数值的表示形式,请使用以下方法:
#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;
}
float
和double
值的位格式是不同的。它是用描述的,并且可能是特定于特定行为(例如“舍入规则”或“操作”)的编译器实现。在许多平台上,数字的符号由保留位表示
对于两个补码整数,最高有效位(MSB)表示符号,当设置值为负时,清除时,值为正。但是,设置位可能无法正确地将值从正值转换为负值
在许多浮点格式中,保留一个位来表示数字的符号。您必须研究各种浮点标准格式,尤其是您的平台和编译器所使用的格式
将负数转换为正数的最佳和最方便的方法是使用abs
函数系列。记住,这是有符号的数据类型
要从正转换为负,请乘以-1或-1.0
未为无符号类型定义负数 在许多平台上,数字的符号由保留位表示 对于两个补码整数,最高有效位(MSB)表示符号,当设置值为负时,清除时,值为正。但是,设置位可能无法正确地将值从正值转换为负值 在许多浮点格式中,保留一个位来表示数字的符号。您必须研究各种浮点标准格式,尤其是您的平台和编译器所使用的格式 将负数转换为正数的最佳和最方便的方法是使用
abs
函数系列。记住,这是有符号的数据类型
要从正转换为负,请乘以-1或-1.0
未为无符号类型定义负数 在许多平台上,数字的符号由保留位表示