【发布时间】:2020-07-12 04:11:33
【问题描述】:
我最近遇到this的问题和@chux - Reinstate Monica给出的答案。
从他们的答案中引用行,“这是实现定义的行为。分配的值可能是 0 或 1 或 2...通常,通过加/减来环绕(“修改”)值256 直到在范围内。100 + 100 -256 --> -56。"
代码:
#include <stdio.h>
int main(void)
{
char a = 127;
a++;
printf("%d", a);
return 0;
}
输出: -128
在大多数 C 编译器中,char 类型采用 1 Byte 大小,严格来说,我假设它是 16 位系统,char 采用 1 Byte。
当a = 127时,它在计算机内部的二进制表示是0111 1111,加1应该得到值
0111 1111 + 0000 0001 = 1000 0000
等于-0(考虑到有符号数表示,其中最左边的位表示0 = + and 1 = -)那么为什么输出等于-128?
是因为“整数提升规则”吗?我的意思是,对于这个表达式a + 1,a 在+ 操作之前被转换为int (2 Bytes),然后它在内存中的二进制表示变为1111 1111 1000 0000,它等于-128,并且对输出有意义-128。但是我的这个假设与 Chux-Reinstate-Monica 关于包装值的引用行相冲突。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。