C++ 理解负数并将其转换

C++ 理解负数并将其转换,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++中有哪些选项可以转换它们,你能通过位移位来完成这一点吗?什么是最好的方法。

这似乎是一个相当大的话题。例如,如果您尝试将-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++中有哪些选项可以转换它们,你能通过位移位来完成这一点吗?什么是最好的方法。

在你的程序中,变量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


未为无符号类型定义负数

在许多平台上,数字的符号由保留位表示