#include <stdio.h>
void main()
{
unsigned char a = 0xfb;
char b = 0xfb;
printf("case1 : %d, %d", a, b); // case1
char x=90, y=60, z=100, h;
h = x*y/z;
printf("\ncase2 : %d", h); // case2
int m = 32768, n = 65536, o = 2, i;
i = m*n/o;
printf("\ncase3 : %d", i); // case3
}
result
case1 : 251, -5
case2 : 54
case3 : -107341824
在 case1 中,标识符 b 编译为 -5,这不是语法错误,认为 char 只接受 -128~127 值。那么,第一个问题是标识符 b 在其翻译结束时首先保存为 int 数据类型?(当翻译结束时,b 将保存在 char 中。)
在 case2 中,x,y 被提升为 int。所以 h 有正确的结果值。但在 case3 中,m、n 不会被提升为 unsigned int(也许)。标识符 I 没有普通值(2^30)。C99 说
如果一个 int 可以表示原始类型的所有值,则将该值转换为 int;否则,它将转换为无符号整数。
基于C99,h的值是自然的,但是处理m*n/o是溢出的。这不自然,因为它反对 C99。这是我的第二个查询。