字符在-128到127之间是否正常?

时间:2017-12-28 23:03:36

标签: c++ character-encoding char bit

为了找出标准8位字符的整数值范围,我运行了以下代码:

int counter = 0;

for (int i = -300; i <= 300; i++)
{
    char c = static_cast<char> (i);

    int num = static_cast<int> (c);

    if (num == i)
    {
        counter ++;
    }

    else
    {
        cout << "Bad:  " << i << "\n";
    }
}

cout << "\n" << counter;

我最终看到计数器的值为256,这是有道理的。但是,在&#34; Bad&#34;的列表中数字(即字母不存储的数字),我发现最大的坏负数是-129,而最小的坏正数是128.

从这个测试来看,似乎chars只存储-128到127的整数值。这个结论是正确的,还是我错过了什么?因为我总是认为字符存储的整数值从0到255。

1 个答案:

答案 0 :(得分:1)

虽然大多数情况下都定义了实现 - 是的,这是正常的,因为您的实现将char定义为signed char。您可以使用CHAR_MINCHAR_MAX宏来打印char类型的最小值和最大值:

#include <iostream>
#include <cstdint>

int main() {
    std::cout << CHAR_MIN << '\n';
    std::cout << CHAR_MAX << '\n';
}

或使用std::numeric_limits课程模板:

#include <iostream>
#include <limits>

int main() {
    std::cout << static_cast<int>(std::numeric_limits<char>::min()) << '\n';
    std::cout << static_cast<int>(std::numeric_limits<char>::max()) << '\n';
}

对于unsigned char类型的0..255范围。最小值为0,最大值应为255。它可以使用以下方式打印出来:

std::cout << UCHAR_MAX;

可以通过以下方式检查类型是否已签名:

std::numeric_limits<char>::is_signed;

摘自char type参考:

  

char - 字符表示的类型,可以是最多的   在目标系统上有效地处理(具有相同的   表示和对齐为 signed charunsigned char,但始终是不同的类型。)