我对以下打印输出有疑问:
int logn = 32;
size_t count = (size_t)1<<logn; /* explicit cast required */
ssize_t count2 = (ssize_t)1<<logn;
fprintf(stderr, "count: %zu, count2: %zd\n", count, count2);
输出: 数:3119849472,计数2:4294967296
为什么这两个给出不同的值?
答案 0 :(得分:7)
ssize_t
是签名类型。在ssize_t
为32位(或更小)的实现中,此表达式为:
(ssize_t)1<< 32
调用未定义的行为。
来自C标准:
(c99,6.5.7p4)“如果E1具有带符号类型和非负值,并且E1 x 2 E2 在结果类型中可表示,那么这就是结果值;否则,行为未定义。“