ssize_t和size_t给出不同的值

时间:2014-07-22 16:11:15

标签: c

我对以下打印输出有疑问:

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

为什么这两个给出不同的值?

1 个答案:

答案 0 :(得分:7)

ssize_t

是签名类型。在ssize_t为32位(或更小)的实现中,此表达式为:

 (ssize_t)1<< 32

调用未定义的行为。

来自C标准:

  

(c99,6.5.7p4)“如果E1具有带符号类型和非负值,并且E1 x 2 E2 在结果类型中可表示,那么这就是结果值;否则,行为未定义。“