ASCII最大数值

ASCII最大数值,c,C,当我保存大于255(十进制)的值并打印ASCII字符时,程序会打印一些字符。为什么?254不是ASCII中最大的数字吗?当我持有负数(例如:-6)时也会发生同样的情况,但不适用于-1和0。为什么?发生的情况取决于您的机器 超出最大可表示值的值通常是环绕的。因此,例如,如果您按住256,它将环绕到0,257将给您1,以此类推,或者,如果您的机器使用有符号字符,而不是256,最大值将是127,128环绕到最负的值(即,-128,带8位字符,假设2的补码表示)。如果这些值恰好表示一个有效的可打印字符,

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

发生的情况取决于您的机器

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


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

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

 1 0000 0000 (a one with 8 zeros)
您尝试分配256,其二进制表示形式如下所示:

 1 0000 0000 (a one with 8 zeros)
一个字符,只能保存8位。因此,第一位被截断,留下如下内容:

 0000 0000 (8 zeros)

这相当于值0。所以,如果您的系统恰巧像我描述的那样工作,那么您最终将打印出与值0关联的任何ascii字符。根据系统详细信息(如endianness),有两种不同的方式可以执行上述操作。

当您执行
%c
打印字符时,它将访问
1byte
打印该
1byte
的内容。使用
8位
=
1字节
可以表示的最大
无符号
数字是
255
(0到(2pow(8-1))-1)
0到255

i、 来自

0000 0000 


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

将8位字符设置为256将换行为0,而不是-128。感谢注意,我修正了我的答案您可能不应该尝试在任何“真实”代码中使用此选项,但特别是如果您现在刚刚学习C,我认为您正在探索该语言的局限性非常好,不仅要弄清楚什么是可能的,还要弄清楚为什么。