【发布时间】:2014-06-22 14:45:00
【问题描述】:
在 C11 (n1570) 中,有一些运算符的结果类型已明确说明。例如,&& 的结果具有 int 类型。 但是我没有找到其他运算符的结果类型,比如+。它是否在标准中的某处指定?
我试过这个程序:
unsigned char usc = 254;
unsigned int usi = 4294967293;
signed char sic = 126;
long long unsigned llu = usc*2;
printf("%llu\n",llu);
llu = usi*2;
printf("%llu\n",llu);
llu = usc+usc;
printf("%llu\n",llu);
llu = usi+usi;
printf("%llu\n",llu);
llu = usc+4294967294;
printf("%llu\n",llu);
llu = usc+2147483646;
printf("%llu\n",llu);
llu = sic+4294967294;
printf("%llu\n",llu);
llu = sic+2147483646;
printf("%llu\n",llu);
输出:
508
4294967290
508
4294967290
4294967548
18446744071562068220
4294967420
18446744071562068092
我猜 unsigned char 在这里得到提升,但 unsigned int 没有; char + unsigned int 的结果类型似乎是 unsigned int,char + int 的结果类型似乎是 int。
但我不太确定。
这些铸件是标准的还是实现定义的?
【问题讨论】:
-
6.3.1.8 为您提供所有答案。
-
-
@this 第二行已经是实现定义的。
unsigned int不需要大于 16 位,因此unsigned int usi = 4294967293;行为usi分配一个值,该值取决于UINT_MAX的实现定义定义。 -
@PascalCuoq 当然,我假设 int 今天到处都是 32 位。
-
@this Assume 把你和我搞得一团糟……知道那个吗?有许多现代机器
int不是 32 位的,尤其是嵌入式机器。 AFAICT,他们仍然大大超过了这种情况。