如果我将size_t
变量设置为-1,例如:
size_t s = -1;
是否保证它将包含s
可以容纳的最大值?
例如,如果sizeof(size_t)
是4个字节,我可以假设s
是0xFFFFFFFF
吗?
作为补充信息:我需要这个来实现一个集合,我打算使用 -1 作为'item not exists'。同时我不想牺牲 0 ,也不想使用int
。
答案 0 :(得分:5)
是的,它保证成为最大值,因为size_t
始终是无符号整数类型,并且无条件整数类型保证包装/使用模运算。正如C11 6.3.1.3p2所说的将整数(-1
是int
类型的常量)转换为无符号整数类型。
[...]如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。
但是,sizeof(size_t) == 4
并不意味着它有32位,因为sizeof
告诉大小以字节为单位 - 即char
s - 和char
CHAR_BIT
位。即使sizeof(size_t) * CHAR_BIT == 32
,size_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");