如何获取std::numeric_limits<char>::min()的值?

4
如何获取(正确且易读的)std::numeric_limits<char>::min()的值?
cout << std::numeric_limits<char>::min() << endl;
cout << std::numeric_limits<char>::max() << endl;

返回

// some character that can't be copied here, it looks like a rectangle containing four numbers in it                  

1
字符小于32或大于127的ASCII码在C++中通常没有标准的可打印值。您要寻找什么? - Mooing Duck
@MooingDuck ASCII 127也不可打印(它是DEL)。 - R. Martinho Fernandes
3个回答

7

您只需要将其转换为流式传输到cout时可以解释为整数的内容。例如:

#include <limits>
#include <iostream>
#include <ostream>

int main()
{
    int minc = std::numeric_limits<char>::min();
    unsigned maxc = std::numeric_limits<char>::max();

    std::cout << minc << std::endl;
    std::cout << maxc << std::endl;
}

我故意使用unsigned来表示std::numeric_limits<char>::max(),以防sizeof(int) == 1并且char是无符号的。


我不是很理解参数部分"sizeof(int) == 1 and char is unsigned"。能否请您详细说明一下? - qazwsx
1
@user6076:一个 char 可能是有符号的,而一个 int 的大小与 char 相同,因此需要一个有符号的 int 来保存最小值。但是,如果 char 是无符号的,则需要一个 unsigned int 来保存最大值。 - Mooing Duck
如果 sizeof(int) == 1char 是无符号的,则 int 将无法表示所有 char 的值,因此将值 std::numeric_limits <char> :: max()char 转换为 int 的结果将导致实现定义的结果,不论它产生什么结果,都不会保留值。为避免这种可能性,我使用了无符号类型,这应该可以保证在这种情况下能够表示 char 的所有值。(据我所知)。 - CB Bailey
我正在努力理解这些注释。被转换的主题是 std::numeric_limits<char>::max() 返回的内容(对吗?),应该是一些数字值,而不是 char,对吗?为什么需要保护它可能是 char 的可能性呢? - qazwsx
一般来说,std::numeric_limits<T>::max() 的返回类型是 T,因此 std::numeric_limits<char>::max() 返回的是 char - CB Bailey
我现在明白了,非常感谢!所以我可以使用任何比 int 最大值更大的类型进行转换,比如 (long int) std::numeric_limits<char>::max(),对吗? - qazwsx

6
问题在于标准流会将char作为字符而不是整数值输出。您可以通过将其转换为非字符类型的整数类型来强制执行此操作:
cout << (int)std::numeric_limits<char>::min() << endl;
cout << (int)std::numeric_limits<char>::max() << endl;

有没有类似于 cout << boolalpha; 的东西,可以改变 cout 的行为,使其以某种良好的形式输出 char 类型的变量? - Meng Lu
@Meng Lu:我不知道有类似的东西。 - R. Martinho Fernandes
2
@user6076,具有最小和最大值的字符可能没有可视化的形式(正如您的实验所示)。我假设您想要打印数字,因为最小值和最大值的概念只在处理数字而不是字符时才有意义。 - R. Martinho Fernandes
对于 char 类型,min() 返回了 -128,而 max() 返回了 127。那么,对应于 127 和 -128 的字符真的没有可视化的形式吗? - qazwsx
在某些编码中,127映射到ASCII DEL字符,该字符会删除前一个字符。大多数编码不映射负数,但-128可能会绕回+128,这可能会映射到C1控制码PAD,即填充字符。它们本身都不是非常可见的。 - CB Bailey
显示剩余3条评论

2

只需将其转换为 int

cout << (int)std::numeric_limits<char>::min() << endl;
cout << (int)std::numeric_limits<char>::max() << endl;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接