显然,标准对此没有任何说明,但从实践/历史的角度来看,我更感兴趣:非二进制补码算术系统是否使用无符号的普通char
类型?否则,你可能会遇到各种奇怪的问题,比如空终止符的两种表示形式,以及无法用char
表示所有“字节”值。这种奇怪的系统确实存在吗?
显然,标准对此没有任何说明,但从实践/历史的角度来看,我更感兴趣:非二进制补码算术系统是否使用无符号的普通char
类型?否则,你可能会遇到各种奇怪的问题,比如空终止符的两种表示形式,以及无法用char
表示所有“字节”值。这种奇怪的系统确实存在吗?
用于终止字符串的空字符永远不可能有两种表示方式。这是这样定义的(即使在C90中也是如此):
一个所有位都设置为0的字节,称为空字符,必须存在于基本执行字符集中。
因此,在一种补码中的“负零”行不通。
话虽如此,我对非二进制补码的C实现并不了解。很久以前在大学里我使用过一种补码机器,但我不记得太多关于它的事情了(即使当时我关心标准,那也是在它出现之前)。
-x == ~x
-x = x ^ 0x80000000
0 + -0
并获得真正的零之类的操作,因此在比较之前常常这样做。我怀疑情况会有些像今天的有符号和无符号类型,并且“-0”绝对不会是字符串终止符。 - DigitalRoss
strcmp
需要将字节比作unsigned char
,但可能必须在任一字符串中达到(任一)空终止符字节时停止比较时,奇怪的问题变得更加严重。 - R.. GitHub STOP HELPING ICE