char数据类型如何与有符号或无符号区分?

时间:2018-03-08 02:00:40

标签: c

我目前正在使用K& R的书 - 第2版学习C.

到目前为止,我已经了解有3种类型的char数据类型(8位): plain char,大多数情况下默认签名但可以根据平台unsigned charsigned char保持未签名。

-1signed char的位模式为11111111,十六进制为0xFF

255unsigned char的位模式为11111111,十六进制为0xFF

那么两者都一样吗?没有任何标志可以表示它是签名还是未签名? 我的问题是它是如何区分的?我显然在这里遗漏了一些东西但什么? : - )

对于int(4个字节),有一个类似的例子:

signed int 255的值在位模式中表示为00000000 00000000 00000000 11111111

unsigned int 255的值在位模式中表示为00000000 00000000 00000000 11111111

两者都是一样的。那么,系统如何发现它是signedunsigned int数据类型?

1 个答案:

答案 0 :(得分:6)

除了如何使用之外没有区别。当您告诉编译器变量是signedunsigned时,它知道在对其执行数学运算时使用有符号或无符号指令。当您使用printf时,您明确提供格式代码,告诉函数该参数是有符号还是无符号(例如%u%d)。当程序运行时,是的,只是查看寄存器和内存,你无法区分-1(作为signed char)和255(作为{ {1}})在具有unsigned char和两个补码数学的系统上,但该程序已将该知识纳入如何工作与其他无法区分的值。

它与指针宽度CHAR_BIT == 80的行为方式相同(或任何其他等效数字和指针模式);它们只是一堆零位,但数字零被操纵并用作数字,而NULL被操作为指针。这些位是相同的,编译器和API使用它们的方式是不同的。