在C ++中char和符号字符之间的区别是什么?(Difference between char a

2019-09-02 16:50发布

考虑下面的代码:

#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;
}

其结果是:

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 

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

如果我可以改变一个charsigned char使用make_signed ,如何做相反的(变换signed charchar )?

Answer 1:

这是由设计, C ++标准说charsigned charunsigned char是不同的类型。 我想你可以使用静态浇铸的转型。



Answer 2:

三种不同的基本字符类型: 字符,符号字符无符号的字符 。 虽然有三种字符类型,只有两种表示法:符号和无符号。 的(普通) 字符使用这些表象之一。 其另外两个字符表示的是相当于焦炭 依赖于编译器

在无符号类型,所有的比特表示的值。 例如,一个8位的无符号字符可以从0到255包括保存的值。

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


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

使用焦炭的计算通常是有问题的。 char是默认某些机器上签名和未签名的人。 因此,我们不应该用在算术表达式(平原) 字符 。 只用它来保存字符。 如果你需要一个很小的整数,明确指定有符号charunsigned char。



Answer 3:

事实上,这个标准是准确告知字符,符号的字符和unsigned char 3种不同类型。 一个char通常是8位,但这不是由标准规定。 一个8位的数目可以编码256点唯一的值; 所不同的只是在那些256个不同的值是如何解释。 如果你考虑一个8位的值作为符号二进制值,它可以表示为-128(编码80H),到+127整数值。 如果你认为这是无符号的,它可以代表的数值0〜255,C ++标准,一个符号的字符是保证能容纳值-127到127(不-128!),而一个无符号的字符是能够保存值0到255。

当一个字符转换为int,其结果是实现定义! 根据机器执行单个字符“E”(ISO 8859-1)的结果可以是例如-55或201。 事实上,CPU拿着炭在一个字(16位)可以存储FFC9或00C9或C900,甚至C9FF(中大,小尾数表示)。 使用符号或无符号的字符不保证焦炭为int转换的结果。



文章来源: Difference between char and signed char in c++?