相关疑难解决方法(0)

为什么首选uint32_t而不是uint_fast32_t?

它似乎uint32_tuint_fast32_t(我意识到这是轶事证据)更普遍.但这对我来说似乎是违反直觉的.

几乎总是当我看到一个实现使用时uint32_t,它真正想要的是一个整数,它可以容纳高达4,294,967,295的值(通常在65,535和4,294,967,295之间的某个更低的界限).

这似乎很奇怪uint32_t,因为不需要"正好32位"保证,并且"最快可用> = 32位"保证uint_fast32_t似乎是正确的想法.而且,虽然它通常是实现的,uint32_t但实际上并不能保证存在.

那么,为什么会更uint32_t受青睐?是简单地知道还是比其他技术有优势?

c c++ int

79
推荐指数
8
解决办法
8183
查看次数

32位无符号乘以64位导致未定义的行为?

所以我有这个代码:

uint32_t s1 = 0xFFFFFFFFU;
uint32_t s2 = 0xFFFFFFFFU;
uint32_t v;
...
v = s1 * s2; /* Only need the low 32 bits of the result */
Run Code Online (Sandbox Code Playgroud)

在以下所有内容中,我假设编译器不能对s1s2仅用于上述示例的初始化器的范围有任何先入之见.

如果我在一个整数大小为32位的编译器上编译它(例如编译x86时),没问题.编译器只是简单地使用s1s2作为uint32_t类型化的值(不能进一步推广它们),并且乘法将简单地给出结果,如注释所示(模数UINT_MAX + 1在这种情况下为0x100000000).

但是,如果我在具有64位整数大小的编译器(例如x86-64)上编译它,则可能会从C标准中推断出未定义的行为.整数提升会看到uint32_t可以提升为int(64位有符号),然后乘法会尝试乘以2 int,如果它们恰好具有示例中显示的值,则会导致整数溢出,这是未定义的行为.

我对此是否正确,如果是这样,你会如何以理智的方式避免它?

我发现了这个类似的问题,但涵盖了C++:什么是最好的C++方式来模块化地安全地无符号整数?.在这里,我想得到一个适用于C的答案(最好是兼容C89).我不会考虑让一台糟糕的32位机器可能执行64位乘法,但这是一个可接受的答案(通常在代码中,这会引起关注,32位性能可能更为关键,因为通常那些机器速度较慢).

注意,当使用具有32位int大小的编译器编译时,同样的问题可以应用于16位无符号整数,或者当使用具有16位int大小的编译器编译时,同样的问题可以应用于无符号字符(后者可能与8位CPU的编译器相同) :C标准要求整数至少为16位,因此符合标准的编译器可能会受到影响).

c undefined-behavior

41
推荐指数
2
解决办法
1993
查看次数

固定宽度整数类型的整数文字

对于像这样的固定宽度整数类型的整数文字是否有一些 c++ 建议?

// i's type is unsigned int
auto i = 10u;
// j's type is uint32_t
auto j = 10u32;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

19
推荐指数
1
解决办法
917
查看次数

标签 统计

c ×2

c++ ×2

c++11 ×1

int ×1

undefined-behavior ×1