2014-07-24 39 views
4

我知道我可以信赖sizeof(char) == 1,但sizeof(uint32_t)sizeof(uint8_t)呢? 不应该是32位(8位)大小的名字猜测? 谢谢!我可以依靠sizeof(uint32_t)== 4吗?

+1

如果'sizeof()'仅在这些情况下返回位而不是字节将会非常不一致。 –

+2

显然,只要'CHAR_BIT == 8',你就可以。现在,如果不是那样的话,找到一个架构并不容易。 – ach

+0

'sizeof()'返回字节数,'uint32_t'指定以位为单位的宽度,所以基本上,目标平台上一个字节的位数是多少?请参阅'CHAR_BIT'。 – Niall

回答

12

固定大小的类型将永远是这个大小。如果你在一个不具有这种大小的整数类型的奇怪平台上,那么它们将是未定义的。

请注意,它不一定遵循sizeof(uint32_t) == 4,如果CHAR_BIT != 8;这只会发生在奇怪的平台上。

1

不,它完全依赖于你的编译器和体系结构(即它会给你不同的结果,你没有整数类型)。如果你得到CHAR_BIT == 8那么是的,你可以依靠这一点。所以,如果你在64位体系结构上将与32位体系结构中的64位边界对齐,那么所有内容都将对齐到4个字节。

因此,如果数据大小很重要(例如一组位标志),请始终使用固定大小类型。

+0

我不明白这一点。这是否意味着'malloc(sizeof(unit32_t)* x)'在64 vs 32 arch上请求“两倍的空间”? – user2864740

+0

@ user2864740: - uint32_t的对齐要求必须小于或等于sizeof(uint32_t)。由于要求uintN_t类型中没有填充,因此sizeof(uint32_t)* CHAR_BIT == 32.其他任何内容都不符合C99。 –

+0

那么它是否依赖(如答案中)或保证(如评论中)uint32_t? :> – user2864740

11

绝对不是,至少关于sizeof(uint32_t)sizeof返回字节数,而不是位数 ,如果平台上的字节是16位,则sizeof(uint32_t) 将是2,而不是4;如果一个字节是32位(并且实际上存在这样的平台 ),则sizeof(uint32_t)将是1(并且uint32_t 可以是到unsigned char的类型定义)。

当然,在这种情况下,uint8_t将不会被定义。

+0

但size_of返回*字节数*或*字符数*?当CHAR_BIT!= 8时它们是否是任何情况? – user2864740

+3

@ user2864740'sizeof(char)'保证等于1. – rightfold

+2

@ user2864740,在C/C++对象模型中,'char'是按字节定义的。 – ach

相关问题