X86 架构 - 使用 unsigned long long 设置向量大小

Posted

技术标签:

【中文标题】X86 架构 - 使用 unsigned long long 设置向量大小【英文标题】:X86 architecture - Set Vector size with unsigned long long 【发布时间】:2020-11-22 05:49:24 【问题描述】:

当我尝试在 x86 架构中使用 unsigned long long 设置矢量大小时,我看到以下错误:

unsigned long long sz;
vec.resize(sz);

错误 C4244:“参数”:从“无符号 __int64”转换为“常量” unsigned int',可能丢失数据

为什么会出现这个错误? x86 架构中 unsigned long long 的行为是什么?如何在 x86 架构中设置 unsigned long long 值的向量大小?

【问题讨论】:

为什么会出现这个错误? -- Read the documentation。 unsigned long long 在哪里指定为要使用的类型? 大小是 size_t,而不是 unsigned long long 【参考方案1】:

像普通人一样使用size_t sz,这是std::vector::resize(size_t)所期望的arg类型,所以使用相同的类型意味着没有隐式转换,因此没有缩小。

unsigned long long 是 64 位类型,但 size_t 只是 32 位,在 32 位代码中。

std::vector 不能大于SIZE_MAX,因此使用更宽的整数类型毫无意义。这就是 MSVC 所抱怨的。如果您在 sz 中从未真正拥有巨大的价值,这不是错误,但您显然将 MSVC 设置为非常迂腐并将警告视为错误。

首先,这种隐式转换是不必要的;通过使用匹配类型来避免它。

【讨论】:

MSVC 并没有抱怨使用更宽的整数类型毫无意义。它警告你隐式整数转换,在我看来,这是 C++ 语言最大的错误。见the documentation for C4244。这是 -W3 和 -W4 处的警告。提问者显然设置了 -Werror 是对的,但我认为您对这个警告的实用性有点不屑一顾,尤其是在一般情况下。 @CodyGray:谢谢,已修复。这就是我的意思(隐式转换毫无意义,而不是警告),但当然,如果有人对 C++ 的了解足以从我最初写的内容中理解我的观点,他们就不需要问这个问题。我的回答是省力的,因为它最初是一个评论。我希望根据标题提出一个更有趣的问题,但向量是 std::vector 不是 SIMD 向量,并且没有特定于 x86 的内容,只是一个具有 32 位 size_t 的平台。 :// 哈哈,是的,我从第一句话就感受到了挫败感。我也笑了。

以上是关于X86 架构 - 使用 unsigned long long 设置向量大小的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 printf 格式化 unsigned long long int?

移位 unsigned char 和 unsigned long long 长期出错

如何将 unsigned long long int 转换为 unsigned char*?

将 unsigned long long 与 rpcgen 一起使用会产生错误

c语言里的无符号unsigned long ulZ = unsigned long dJDM,在java里怎么办?用long型没有c那么大的数值。

如何将 unsigned char* 转换为 unsigned long long int?