当我持有大于 255(十进制)的值并打印 ASCII 字符时,程序会打印一些字符。为什么?254 不是 ASCII 中最大的数字吗?当我持有负数(例如:-6)时也会发生同样的事情,但不适用于 -1 和 0。为什么?
3 回答
会发生什么取决于您的机器。
超出可表示的最大值的值通常会回绕。因此,例如,如果您持有 256,它将回绕为 0,257 将给您 1,等等,或者,如果您的机器使用带符号的字符,而不是 256,最大值将为 127,并且 128 回绕到最负值(即 -128 和 8 位字符,假设为 2 的补码表示)。如果这些值恰好代表一个有效的可打印字符,那么这就是你得到的。
请注意,假设溢出的值环绕通常是不安全的:C 标准不要求发生这种情况,因此,从技术上讲,依赖该技巧的程序具有未定义的行为。
这是未定义的行为,确切的结果将取决于您的编程语言/编译器/计算机等的某种组合。有时你会遇到异常或崩溃,有时你会得到一个字符。就角色而言,您最有可能看到的是溢出。标准的 char 类型是单字节,由 8 位组成,可以是 0 或 1。详细信息会因您的系统而异,但会发生如下情况:
您尝试分配 256,其二进制表示如下所示:
1 0000 0000 (a one with 8 zeros)
到一个字符,它只能保存 8 位。因此,第一位被截断,留下这个:
0000 0000 (8 zeros)
这相当于值 0。因此,如果您的系统碰巧像我描述的那样工作,您最终会打印出与值 0 相关联的任何 ascii 字符。上面有几种不同的方式可以发挥作用,具体取决于系统细节,如字节顺序。
当您%c
打印一个字符时,它将访问1byte
打印该字符的内容1byte
。unsigned
可以使用8bits
=表示的最大数字1byte
是255
(0 to (2pow(8-1))-1)
ie0 to 255
即从
0000 0000
至
1111 1111
当您尝试1 0000 0001
使用 %c 以二进制 ( ) 打印 257 时,它只会看到1 byte
ie 0000 0001
。对应的字符0000 0001
被打印出来。