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那么大的数值。