我最近读到了之间的区别
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是一样的.
| 归档时间: |
|
| 查看次数: |
2515 次 |
| 最近记录: |