ssize_t和size_t给出不同的值

2 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);
Run Code Online (Sandbox Code Playgroud)

输出:计数:3119849472,计数2:4294967296

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

oua*_*uah 6

ssize_t
Run Code Online (Sandbox Code Playgroud)

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

 (ssize_t)1<< 32
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为.

从C标准:

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