c ++中char和signed char之间的区别?

Vin*_*ent 26 c++ signed char type-traits c++11

请考虑以下代码:

#include <iostream>
#include <type_traits>

int main(int argc, char* argv[])
{
    std::cout<<"std::is_same<int, int>::value = "<<std::is_same<int, int>::value<<std::endl;
    std::cout<<"std::is_same<int, signed int>::value = "<<std::is_same<int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<int, unsigned int>::value = "<<std::is_same<int, unsigned int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, int>::value = "<<std::is_same<signed int, int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, signed int>::value = "<<std::is_same<signed int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, unsigned int>::value = "<<std::is_same<signed int, unsigned int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, int>::value = "<<std::is_same<unsigned int, int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, signed int>::value = "<<std::is_same<unsigned int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, unsigned int>::value = "<<std::is_same<unsigned int, unsigned int>::value<<std::endl;
    std::cout<<"----"<<std::endl;
    std::cout<<"std::is_same<char, char>::value = "<<std::is_same<char, char>::value<<std::endl;
    std::cout<<"std::is_same<char, signed char>::value = "<<std::is_same<char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<char, unsigned char>::value = "<<std::is_same<char, unsigned char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, char>::value = "<<std::is_same<signed char, char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, signed char>::value = "<<std::is_same<signed char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, unsigned char>::value = "<<std::is_same<signed char, unsigned char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, char>::value = "<<std::is_same<unsigned char, char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, signed char>::value = "<<std::is_same<unsigned char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, unsigned char>::value = "<<std::is_same<unsigned char, unsigned char>::value<<std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

std::is_same<int, int>::value = 1
std::is_same<int, signed int>::value = 1
std::is_same<int, unsigned int>::value = 0
std::is_same<signed int, int>::value = 1
std::is_same<signed int, signed int>::value = 1
std::is_same<signed int, unsigned int>::value = 0
std::is_same<unsigned int, int>::value = 0
std::is_same<unsigned int, signed int>::value = 0
std::is_same<unsigned int, unsigned int>::value = 1
----
std::is_same<char, char>::value = 1
std::is_same<char, signed char>::value = 0
std::is_same<char, unsigned char>::value = 0
std::is_same<signed char, char>::value = 0
std::is_same<signed char, signed char>::value = 1
std::is_same<signed char, unsigned char>::value = 0
std::is_same<unsigned char, char>::value = 0
std::is_same<unsigned char, signed char>::value = 0
std::is_same<unsigned char, unsigned char>::value = 1 
Run Code Online (Sandbox Code Playgroud)

这意味着intsigned int被认为是相同类型,但不是charsigned char.这是为什么 ?

如果我可以转换charsigned char使用make_signed,如何做相反的事情(转换signed char为a char)?

Ser*_*gi0 18

它是按设计,C++标准char,signed char并且unsigned char是不同的类型.我认为你可以使用静态转换进行转换.


小智 18

三种不同的基本字符类型:char,signed charunsigned char.虽然有三种字符类型,但只有两种表示形式:有符号和无符号.(普通)char使用这些表示之一.其他两个字符表示中的哪一个等同于char 取决于编译器.

在无符号类型中,所有位代表值.例如,8位无符号字符可以保存0到255之间的值.

该标准没有定义如何表示签名类型,但是指定范围应该在正值和负值之间平均分配.因此,保证8位有符号字符能够保存-127到127之间的值.


那么如何决定使用哪种类型呢?

使用char的计算通常是有问题的. 默认情况下,Char在某些计算机上签名,在其他计算机上签名.所以我们不应该在算术表达式中使用(plain)char.仅用于保存字符.如果需要一个小整数,请显式指定signed charunsigned char.

  • 我知道这篇文章是很久以前的,但这个答案与 *C++ Primer*,第二章中的一段相同。 (9认同)

ber*_*auz 6

实际上,标准正在告诉char,signed char和unsigned char是3种不同的类型.char通常是8位,但这不是标准强加的.一个8位数字可以编码256个唯一值; 区别仅在于如何解释这256个唯一值.如果将8位值视为带符号二进制值,则它可以表示从-128(编码为80H)到+127的整数值.如果你认为它是无符号的,它可以表示0到255的值.根据C++标准,有符号的char保证能够保存-127到127(不是-128!)的值,而unsigned char能够保存值0到255.

将char转换为int时,结果是实现定义的!根据单个字符'''(ISO 8859-1)的机器实现,结果可以是例如-55或201.实际上,一个字(16位)保存字符的CPU可以存储FFC9或00C9或C900,甚至C9FF(在大端和小端表示中).使用signed或unsigned char确保char转换为int转换结果.