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