代码之家  ›  专栏  ›  技术社区  ›  Vishal Subramanyam

如何将char数据类型用作数字而不是字符?

  •  2
  • Vishal Subramanyam  · 技术社区  · 10 年前

    当我使用 char datatype添加两个数字,我得到的是字符的ASCII码的和,而不是数字本身。当我在互联网上进行研究时,各种网站都说 烧焦 类型确实可以用于处理单字节数。但实际上,我得到了ASCII值的总和。为什么会发生这种情况?下面只是说明问题的示例代码:

    uint8_t rows,cols; //uint8_t is just a typedef for char
    cin >> rows;
    cout << rows + 1 << endl;
    
    3 回复  |  直到 10 年前
        1
  •  2
  •   Throw Away Account    10 年前

    当人们谈论“单字节数”时,他们谈论的是8位值,范围从-128到127 char ,或0到255表示 unsigned char ,也称为 八位位组 。这些可以直接转换为较大的整数类型和浮点类型:

    char eight_bit = 122;
    float floating_point = eight_bit; // = 122.0
    

    如果您试图转换数字值,例如 '1' 在它表示的数值中 stoi :

    #include <string>
    
    int ctoi(char c) {
        std::string temp;
        temp.push_back(c);
        return std::stoi(temp);
    }
    
        2
  •  0
  •   Asjad Athick    10 年前

    字符将字符的ASCII等效值存储为整数。

    例如

    char value = 'A' // == int 65
    

    最好用一个短整数来存储数字,但如果你真的想,你可以这样做;

    char value1 = '2';
    char value2 = '5';
    char sum = (value1 + value2) - '0'; // int value of sum would be 7
    
        3
  •  0
  •   Alex Lop.    10 年前

    当您使用 char ,您使用带符号的8位数据类型(大部分)。

    你得到“ASCII码的总和”只是因为 std::cout 被编程为显示 烧焦 作为ASCII字符。

    尝试

    cout << stratic_cast<int16_t>(rows) + 1 << endl;
    

    你会看到你得到的是“数字”而不是“ASCII字符”。

    注释

    uint8_t 不是(或可能不应该是) 烧焦 自从 烧焦 定义为 签署 数据类型while uint* 代表 未签名的 .