将size_t变量设置为-1

时间:2017-07-28 17:20:54

标签: c

如果我将size_t变量设置为-1,例如:

size_t s = -1;

是否保证它将包含s可以容纳的最大值?

例如,如果sizeof(size_t)是4个字节,我可以假设s0xFFFFFFFF吗?

作为补充信息:我需要这个来实现一个集合,我打算使用 -1 作为'item not exists'。同时我不想牺牲 0 ,也不想使用int

2 个答案:

答案 0 :(得分:5)

是的,它保证成为最大值,因为size_t始终是无符号整数类型,并且无条件整数类型保证包装/使用模运算。正如C11 6.3.1.3p2所说的将整数(-1int类型的常量)转换为无符号整数类型。

  

[...]如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。

但是,sizeof(size_t) == 4并不意味着它有32位,因为sizeof告诉大小以字节为单位 - 即char s - 和char CHAR_BIT位。即使sizeof(size_t) * CHAR_BIT == 32size_t仍然可以有少于32个值位(其余的将是填充位)。

P.S。我建议您使用SIZE_MAX中的<stdint.h>代替。

答案 1 :(得分:1)

@Antti Haapala回答,我添加了这个来解决OP的更高目标。

  

作为补充信息:我需要这个来实现一个集合,我打算使用-1作为&#39; item不存在&#39;。与此同时,我不想牺牲0,也不想使用int

不是像-1这样的裸幻数,而是定义一个值。而不是-1,使用SIZE_MAX。它是正确的值匹配的提升类型。

#include <stdint.h>
#define ITEM_NO_EXIST (SIZE_MAX)

...
// size_t s = -1;
size_t s = ITEM_NO_EXIST;
...
if (s == ITEM_NO_EXIST) puts("Item does not exist");