3

当我持有大于 255(十进制)的值并打印 ASCII 字符时,程序会打印一些字符。为什么?254 不是 ASCII 中最大的数字吗?当我持有负数(例如:-6)时也会发生同样的事情,但不适用于 -1 和 0。为什么?

4

3 回答 3

6

会发生什么取决于您的机器。

超出可表示的最大值的值通常会回绕。因此,例如,如果您持有 256,它将回绕为 0,257 将给您 1,等等,或者,如果您的机器使用带符号的字符,而不是 256,最大值将为 127,并且 128 回绕到最负值(即 -128 和 8 位字符,假设为 2 的补码表示)。如果这些值恰好代表一个有效的可打印字符,那么这就是你得到的。

请注意,假设溢出的值环绕通常是不安全的:C 标准不要求发生这种情况,因此,从技术上讲,依赖该技巧的程序具有未定义的行为。

于 2013-11-06T09:45:29.193 回答
0

这是未定义的行为,确切的结果将取决于您的编程语言/编译器/计算机等的某种组合。有时你会遇到异常或崩溃,有时你会得到一个字符。就角色而言,您最有可能看到的是溢出。标准的 char 类型是单字节,由 8 位组成,可以是 0 或 1。详细信息会因您的系统而异,但会发生如下情况:

您尝试分配 256,其二进制表示如下所示:

 1 0000 0000 (a one with 8 zeros)

到一个字符,它只能保存 8 位。因此,第一位被截断,留下这个:

 0000 0000 (8 zeros)

这相当于值 0。因此,如果您的系统碰巧像我描述的那样工作,您最终会打印出与值 0 相关联的任何 ascii 字符。上面有几种不同的方式可以发挥作用,具体取决于系统细节,如字节顺序。

于 2013-11-06T09:50:54.527 回答
0

当您%c打印一个字符时,它将访问1byte打印该字符的内容1byteunsigned可以使用8bits=表示的最大数字1byte255 (0 to (2pow(8-1))-1)ie0 to 255

即从

0000 0000 

1111 1111

当您尝试1 0000 0001使用 %c 以二进制 ( ) 打印 257 时,它只会看到1 byteie 0000 0001。对应的字符0000 0001被打印出来。

于 2013-11-06T09:53:20.647 回答