【发布时间】:2020-10-05 03:27:58
【问题描述】:
这可能是一个非常基本的问题,但我无法做到。 这是我正在使用的。
#include <stdio.h>
int main(void)
{
char c1, c2;
int s;
c1 = 128;
c2 = -128;
s = sizeof(char);
printf("size of char: %d\n", s);
printf("c1: %x, c2: %x\n", c1, c2);
printf("true or false: %d\n", c1 == c2);
}
结果是这样的。
size of char: 1
c1: ffffff80, c2: ffffff80
true or false: 1
我将值 128 分配给有符号(普通)字符类型,但它没有溢出。
此外,c1 和 c2 似乎都拥有 4 个字节,而 -128 和 128 是相同的值。
我怎样才能理解这些事实?我需要你的帮助。非常感谢。
【问题讨论】:
-
-128 的 4 字节整数的二进制补码是什么?
-
我认为您看到的是promotion 和签名扩展。
-
我对你的说法感到困惑。在这段代码中,您将 128 分配给了有符号字符类型,但它确实溢出了。这与您期望的范围是 -128 到 127 一致。
-
2)
%x需要unsigned int。您的char正在升级中。 -
您已经在标题中说范围是
-128 to 127,那么您为什么要尝试使用(+)128?
标签: c char signed integer-promotion internal-representation