我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.
我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:
CHAR_BIT != 8signed 不是两个补充(我听说Java有这个问题).我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型†.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.
所以问题是:哪些架构具有上述属性?
† uint*_ts是可选的.
它似乎uint32_t比uint_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受青睐?是简单地知道还是比其他技术有优势?
stdint.h和inttypes.h有什么区别?
如果没有使用它们,则无法识别uint64_t,但使用其中任何一个都是定义的类型.
假设我有一个按位表达式f: int -> int,它只依赖于输入的两个最低字节.在一般情况下,这将是任何更快的计算(uint32)f'((uint16)x),在那里f': short -> short?或者转换涉及开销?假设f编译器过于复杂,无法自行解决这个问题.
我目前正在开发一个类来处理大的无符号整数。但是,我需要不完整的功能,即:
\nbi_uint+=bi_uint- 已经实施。没什么好抱怨的。bi_uint*=std::uint_fast64_t- 已经实施。没什么好抱怨的。bi_uint/=std::uint_fast64_t- 已实现,但工作速度非常慢,还需要两倍宽的类型uint_fast64_t。在测试用例中,除法比乘法慢35倍接下来,我将给出我的除法实现,它基于一个简单的长除法算法:
\n#include <climits>\n#include <cstdint>\n#include <limits>\n#include <vector>\n\nclass bi_uint\n{\npublic:\n using u64_t = std::uint_fast64_t;\n constexpr static std::size_t u64_bits = CHAR_BIT * sizeof(u64_t);\n using u128_t = unsigned __int128;\n static_assert(sizeof(u128_t) >= sizeof(u64_t) * 2);\n\n //little-endian\n std::vector<u64_t> data;\n\n //User should guarantee data.size()>0 and val>0\n void self_div(const u64_t val)\n {\n auto it = data.rbegin();\n\n if(data.size() == 1) {\n *it /= val;\n return;\n } \n \n …Run Code Online (Sandbox Code Playgroud) 我一直在阅读这篇文章,并且怀疑打印此数据类型的正确且可移植的方法是什么?
uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t
Run Code Online (Sandbox Code Playgroud)
也签了。
c ×5
c++ ×3
algorithm ×1
architecture ×1
biginteger ×1
c++20 ×1
int ×1
optimization ×1
performance ×1
stdint ×1
uint64 ×1
x86 ×1