最近,我读了之间的差异
char
unsigned char
和
signed char
是平台特定的。
我不能完全得到我的头轮呢? 意思IE下PLATFORM1符号是第一位,PLATFORM2符号可能是在年底的比特序列可以从一个平台有什么不同? 你会如何编写针对这个?
基本上我的问题来自看到这一行:
typedef unsigned char byte;
我不明白标牌的相关性?
最近,我读了之间的差异
char
unsigned char
和
signed char
是平台特定的。
我不能完全得到我的头轮呢? 意思IE下PLATFORM1符号是第一位,PLATFORM2符号可能是在年底的比特序列可以从一个平台有什么不同? 你会如何编写针对这个?
基本上我的问题来自看到这一行:
typedef unsigned char byte;
我不明白标牌的相关性?
让我们假设你的平台有八位字节,假设我们有位模式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
带符号上任何您使用的平台和编译器。
你误会了一些东西。 符号字符总是签署。 无符号的字符始终是无。 但是普通的字符是否带有符号是特定的实现 - 这意味着它取决于你的编译器。 这使得差别从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的是一样的。
这是更正确的说,这是编译器特定的,你不应该指望char
使用时签字或无符号char
没有signed
或unsigned
预选赛。
否则,你将面临以下问题:您编写和调试假设程序char
默认情况下签署,然后将其重新编译一个编译器,否则假设和程序行为急剧变化。 如果你在你的代码,而依靠这种假设只有一次,你的风险在某些情况下,这是在特定条件下在你的程序才会触发,并且非常难以检测和调试面临的意外情况。
也许你指的是事实的符号性char
是编译器/平台特定的。 下面是揭示了它一些轻博客条目:
在C和C的字符类型++
有一个符号字符是更多的所有基本变量类型是如何用C处理的侥幸,通常它实际上不是非常有用的反面人物。
一个符号字符始终是8位,并一直在符号位中的最后一位。
unsigned char类型始终是8位,没有符号位。
一个char是据我所知总是无符号的。 任何编译器默认为一个符号的字符会面临很多不兼容的程序的。