C++ 有人能解释char的符号性是如何特定于平台的吗?

C++ 有人能解释char的符号性是如何特定于平台的吗?,c++,signedness,C++,Signedness,我最近读到 char unsigned char 及 是特定于平台的。 我不能完全理解这个?这是否意味着位序列在不同的ie平台之间可能会有所不同?1符号是第一位,2平台符号可能在末尾?您将如何对此进行编码 基本上,我的问题来自于这一行: typedef unsigned char byte; 我不理解标识的相关性?更正确的说法是,它是特定于编译器的,在使用char时,如果没有已签名或未签名限定符,则不应指望char已签名或未签名 否则,您将面临以下问题:您编写和调试程序时假设char在默认情

我最近读到

char
unsigned char

是特定于平台的。
我不能完全理解这个?这是否意味着位序列在不同的ie平台之间可能会有所不同?1符号是第一位,2平台符号可能在末尾?您将如何对此进行编码

基本上,我的问题来自于这一行:

typedef unsigned char byte;

我不理解标识的相关性?

更正确的说法是,它是特定于编译器的,在使用
char
时,如果没有
已签名
未签名
限定符,则不应指望
char
已签名或未签名


否则,您将面临以下问题:您编写和调试程序时假设
char
在默认情况下是有符号的,然后使用编译器重新编译程序(假设不是这样),并且程序行为会发生剧烈变化。如果在代码中仅偶尔依赖此假设一次,则在某些情况下可能会遇到意外行为,这些行为仅在特定条件下在程序中触发,并且很难检测和调试。

有符号字符更像是C中处理所有基变量类型的侥幸行为,一般来说,使用负数字符实际上是没有用的。

也许您指的是
char
的符号性是特定于编译器/平台的。以下是一篇博客文章,可以说明这一点:


有符号字符始终为8位,并且始终将有符号位作为最后一位

无符号字符始终为8位,并且没有符号位


据我所知,字符总是未签名的。任何默认为带符号字符的编译器都将面临许多不兼容的程序。

您误解了某些内容。已签名字符总是已签名的。未签名的字符总是未签名的。但是普通字符是有符号的还是无符号的是特定于实现的,这意味着它取决于编译器。这与int类型不同,int类型都是有符号的(int与有符号int相同,short与有符号short相同)。更有趣的是,就函数重载而言,char、signed char和unsigned char被视为三种不同的类型。这意味着在同一个编译单元中可以有三个函数重载:

void overload(char);
void overload(signed char);
void overload(unsigned char);
对于int类型,则相反,不能有

void overload(int);
void overload(signed int);

因为int和signed int是相同的。

让我们假设您的平台有八位字节,并假设我们有位模式
10101010
。对于签名字符,该值为−86然而,对于
无符号字符
,相同的位模式表示170。我们一点也没动;这是相同的位,用两种不同的方式解释

现在是
char
。标准没有说明这两种解释中哪一种是正确的。持有位模式
10101010
char
可以是−86或170。它将是这两个值中的一个,但在预测它将是哪一个之前,您必须了解编译器和平台。一些编译器提供了一个命令行开关来控制它将是哪一个。一些编译器有不同的默认值,这取决于它们运行的操作系统,因此它们可以匹配操作系统约定

在大多数代码中,这并不重要。为了重载,它们被视为三种不同的类型。指向其中一种类型的指针与指向另一种类型的指针不兼容。尝试使用
有符号字符*
无符号字符*
调用
strlen
;这行不通

如果需要单字节有符号数字类型,请使用
signed char
;如果需要单字节无符号数字类型,请使用
unsigned char
。当您想要保存字符时,请使用普通的旧
char
。这就是程序员在编写您所询问的typedef时的想法。名称“byte”没有保存字符数据的含义,而名称“unsigned char”的名称中有“char”一词,这导致一些人认为它是保存字符的好类型,或者将其与
char
类型的变量进行比较是个好主意


因为你不太可能对字符做一般的算术运算,在您使用的任何平台和编译器上,
char
是有符号的还是无符号的都无关紧要。

许多人会说“一般来说,没有符号的char是没有用的”,这就是char的符号在不同实现之间不同的原因。这是我不理解的,当然,签名后的字符比签名更有用,而且实际上你给字符分配了一个负值,宽字符支持,现在比负值字符更重要。亚当,当一个字符没有足够的填充每个ANSI C/ISOC++(一个ASCII字符集)中的一个字节时,这并不重要。因此,符号位更多的是为了更好的衡量。@William Pursell:我从来没有觉得对“char”进行签名是有用的,而让它们不签名会使很多字符(文本)处理变得更简单。我想这就是我实际上读到的!我在问题中添加了以下内容:为什么有些平台有
无符号字符
,而另一些平台有
有符号字符
作为
字符
字符并不总是8位。从历史上看,通常是9。目前,它通常是16或32。字符中的位数是char\u位,这取决于实现。我不相信这是正确的。。。明确指出char==1字节和1字节==至少8位的?gcc,默认情况下msvc将char识别为带符号的char。Yossarian,对于gcc,默认值取决于它运行在哪个平台上。下面是一个令人惊讶的行为示例:ISO 8859-1中的土耳其y-umlaut(ÿ,Unicode U+00FF)出现了一个经典问题,字符代码255。如果char是有符号的,它可能会与EOF混淆,后者通常是-1.I
void overload(int);
void overload(signed int);