有人可以解释char的签名是如何特定于平台的吗?

Ada*_*lor 10 c++ signedness

我最近读到了之间的区别

char
unsigned char
Run Code Online (Sandbox Code Playgroud)

signed char
Run Code Online (Sandbox Code Playgroud)

是特定于平台的.
我不能完全理解这个问题?这是否意味着位序列可以从一个平台到另一个平台变化,即平台1,标志是第一位,平台2标志可能在末尾?你会怎么对这个代码?

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

typedef unsigned char byte;
Run Code Online (Sandbox Code Playgroud)

我不明白标牌的相关性?

Rob*_*edy 18

假设您的平台有8位字节,假设我们有位模式10101010.对于a signed char,该值为-86.对于unsigned char,虽然,相同的位模式代表170.我们还没有搬来搬去任何位; 它是相同的位,以两种不同的方式解释.

现在为char.该标准没有说明这两种解释中的哪一种应该是正确的.一个char拿着位模式10101010可能是要么 -86 170这将是这两个值中的一个,但你必须知道的编译器和平台,然后才能预测它会.一些编译器提供命令行开关来控制它将是哪一个.某些编译器具有不同的默认值,具体取决于它们运行的​​操作系统,因此它们可以匹配操作系统约定.

在大多数代码中,它确实无关紧要.出于重载的目的,它们被视为三种不同的类型.指向其中一种类型的指针与指向另一种类型的指针不兼容.尝试strlen使用a signed char*或an unsigned char*; 它不会起作用.

使用signed char当你想要一个字节的符号数字型,并使用unsigned char当你想要一个字节的无符号的数值类型.char如果要保留字符,请使用普通旧字符.这就是程序员在编写你要求的typedef时的想法.名称"byte"没有保存字符数据的含义,而名称"unsigned char"在其名称中包含单词"char",这导致某些人认为它是用于保存字符的好类型,或者将它与类型变量进行比较是个好主意char.

由于您不太可能对字符进行一般算术运算,因此char在您使用的任何平台和编译器上签名或未签名都无关紧要.


Tad*_*pec 17

你误会了什么.signed char总是签名.unsigned char始终是无符号的.但是普通字符是有符号还是无符号是特定于实现的 - 这意味着它取决于您的编译器.这与int类型有所不同,int类型都是有符号的(int与signed int相同,short与signed short相同).更有趣的是char,signed char和unsigned char在函数重载方面被视为三种不同的类型.这意味着您可以在同一个编译单元中拥有三个函数重载:

void overload(char);
void overload(signed char);
void overload(unsigned char);
Run Code Online (Sandbox Code Playgroud)

对于int类型是相反的,你不能拥有

void overload(int);
void overload(signed int);
Run Code Online (Sandbox Code Playgroud)

因为int和signed int是一样的.