是否有可能(符合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;
不使用精确宽度整数类型,它不能有填充。
当然这并不常见 - 只是想知道规范允许什么。
答案 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)>23
,uint8_t
和uint16_t
都已定义,则必须使用8位,16位或32位存储它们,否则填充位,因此如果36位机器的符合标准的编译器定义了这种二次幂大小的类型,它必须使用其他名称;遗憾的是,标准为数字行为正确但不满足预期存储布局的类型提供了标准名称。