无符号整数类型总是具有不同的大小吗?

时间:2015-05-13 19:27:58

标签: c language-lawyer

是否有可能(符合C规范)有2个无符号整数类型的不同范围但是具有相同的大小(由于填充)?

#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>

int main(void) {
  printf("Size:%zu  Max:%llu\n", 
      sizeof(unsigned_32_t), (unsigned long long) ((unsigned_32_t) -1));
  // Size:4 Max:4294967295

  printf("Size:%zu  Max:%llu\n", 
      sizeof(unsigned_24_t), (unsigned long long) ((unsigned_24_t) -1));
  // Size:4 Max:16777215

  return 0;

不使用精确宽度整数类型,它不能有填充。

当然这并不常见 - 只是想知道规范允许什么。

2 个答案:

答案 0 :(得分:2)

总的来说,是的,这绝对是可能的。

对于uintN_t中定义的<stdint.h>类型的具体情况,如您所述(C11§7.20.1.1):

  

typedef名称uintN_t指定宽度为N的无符号整数类型   并且没有填充位。因此,uint24_t表示这样的无符号整数   类型,宽度恰好为24位。

答案 1 :(得分:2)

作为兼容性辅助,具有36位内存总线和9位char的系统可能包括8位,16位和32位无符号类型(*) )分别包含mod 256,65536和4294967296。这些类型将使用与9,18和36位类型相同的存储量,并且将以基本相同的方式存储,除了操作将屏蔽高位。给定16位无符号变量u,编译器可以实现u++等效于u=(u+1) & 65535;并实现u>23作为18位比较,或者可以实现{ {1}}为18位增量并将u++实现为u>23

(*)标准规定,如果(u & 65535)>23uint8_tuint16_t都已定义,则必须使用8位,16位或32位存储它们,否则填充位,因此如果36位机器的符合标准的编译器定义了这种二次幂大小的类型,它必须使用其他名称;遗憾的是,标准为数字行为正确但不满足预期存储布局的类型提供了标准名称。