我目前正在使用K& R的书 - 第2版学习C.
到目前为止,我已经了解有3种类型的char
数据类型(8位): plain char
,大多数情况下默认签名但可以根据平台unsigned char
和signed char
保持未签名。
-1
中signed char
的位模式为11111111
,十六进制为0xFF
。
255
中unsigned char
的位模式为11111111
,十六进制为0xFF
。
那么两者都一样吗?没有任何标志可以表示它是签名还是未签名? 我的问题是它是如何区分的?我显然在这里遗漏了一些东西但什么? : - )
对于int
(4个字节),有一个类似的例子:
signed int
255
的值在位模式中表示为00000000 00000000 00000000 11111111
unsigned int
255
的值在位模式中表示为00000000 00000000 00000000 11111111
两者都是一样的。那么,系统如何发现它是signed
或unsigned
int数据类型?
答案 0 :(得分:6)
除了如何使用之外没有区别。当您告诉编译器变量是signed
或unsigned
时,它知道在对其执行数学运算时使用有符号或无符号指令。当您使用printf
时,您明确提供格式代码,告诉函数该参数是有符号还是无符号(例如%u
与%d
)。当程序运行时,是的,只是查看寄存器和内存,你无法区分-1
(作为signed char
)和255
(作为{ {1}})在具有unsigned char
和两个补码数学的系统上,但该程序已将该知识纳入如何工作与其他无法区分的值。
它与指针宽度CHAR_BIT == 8
和0
的行为方式相同(或任何其他等效数字和指针模式);它们只是一堆零位,但数字零被操纵并用作数字,而NULL
被操作为指针。这些位是相同的,编译器和API使用它们的方式是不同的。