一个人能解释字符的符号性如何是特定于平台的?(Can someone explain how the

2019-07-31 04:22发布

最近,我读了之间的差异

char
unsigned char

signed char

是平台特定的。
我不能完全得到我的头轮呢? 意思IE下PLATFORM1符号是第一位,PLATFORM2符号可能是在年底的比特序列可以从一个平台有什么不同? 你会如何编写针对这个?

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

typedef unsigned char byte;

我不明白标牌的相关性?

Answer 1:

让我们假设你的平台有八位字节,假设我们有位模式10101010 。 为了一个signed char ,该值是-86。 对于unsigned char ,不过,相同的位模式代表170.我们还没有搬来搬去任何位; 它是相同的位,演绎两种不同的方式。

现在的char 。 该标准并没有说这这两个解释应该是正确的。 一个char拿着位模式10101010可能是要么 -86 170这将是这两个值中的一个,但你必须知道的编译器和平台,然后才能预测它会。 一些编译器提供一个命令行开关,以控制将是哪一个。 一些编译器可以根据他们正在运行什么操作系统不同的默认值,这样他们就可以匹配OS约定。

在大部分的代码,它真的不应该的问题。 他们被视为三种不同类型的,超载的目的。 指向这些类型之一是不指向另一种类型的兼容。 尝试调用strlen一个signed char*unsigned char* ; 它不会工作。

使用signed char当你想要一个字节的符号数字型,并使用unsigned char ,当你想要一个字节的无符号的数值类型。 使用普通的老char ,当你想保持字符。 这就是写你问有关的typedef当程序员的想法。 命名为“字节”不具有保持字符数据的内涵,而命名为“无符号的字符”在其名称中的“字符”,并导致一些人认为这是一个很好的类型保持字符,或它是把它与类型的变量比较好主意char

因为你不可能做字符通用算术,都不会有问题是否char带符号上任何您使用的平台和编译器。



Answer 2:

你误会了一些东西。 符号字符总是签署。 无符号的字符始终是无。 但是普通的字符是否带有符号是特定的实现 - 这意味着它取决于你的编译器。 这使得差别从int类型,而这一切都签署(int是一样的签署是int,short是一样的符号short)。 更有趣的是字符,符号的字符和unsigned char在函数重载方面为三种不同类型的处理。 这意味着你可以在同一个编译单元三个功能重载:

void overload(char);
void overload(signed char);
void overload(unsigned char);

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

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

因为int和signed int的是一样的。



Answer 3:

这是更正确的说,这是编译器特定的,你不应该指望char使用时签字或无符号char没有signedunsigned预选赛。

否则,你将面临以下问题:您编写和调试假设程序char默认情况下签署,然后将其重新编译一个编译器,否则假设和程序行为急剧变化。 如果你在你的代码,而依靠这种假设只有一次,你的风险在某些情况下,这是在特定条件下在你的程序才会触发,并且非常难以检测和调试面临的意外情况。



Answer 4:

也许你指的是事实的符号性char是编译器/平台特定的。 下面是揭示了它一些轻博客条目:

在C和C的字符类型++



Answer 5:

有一个符号字符是更多的所有基本变量类型是如何用C处理的侥幸,通常它实际上不是非常有用的反面人物。



Answer 6:

一个符号字符始终是8位,并一直在符号位中的最后一位。

unsigned char类型始终是8位,没有符号位。

一个char是据我所知总是无符号的。 任何编译器默认为一个符号的字符会面临很多不兼容的程序的。



文章来源: Can someone explain how the signedness of char is platform specific?