将一个int(16位)数组设置为short的最大值

sli*_*oad 7 c c++ memset

似乎无法在任何地方找到答案,如何将数组memset到数组类型的最大值?我原以为memset(ZBUFFER,0xFFFF,size)ZBUFFER是一个16位整数数组.相反,我得到-1s.

此外,我们的想法是尽可能快地完成这项工作(这是一个需要初始化每一帧的zbuffer),所以如果有更好的方法(并且仍然快速或更快),请告诉我.

编辑:作为澄清,我需要一个签名的int数组.

Did*_*set 9

C++中,您将使用std :: fill和std :: numeric_limits.

#include <algorithm>
#include <iterator>
#include <limits>

template <typename IT>
void FillWithMax( IT first, IT last )
{
    typedef typename std::iterator_traits<IT>::value_type T;
    T const maxval = std::numeric_limits<T>::max();
    std::fill( first, last, maxval );
}

size_t const size=32;
short ZBUFFER[size];
FillWithMax( ZBUFFER, &ZBUFFER[0]+size );
Run Code Online (Sandbox Code Playgroud)

这适用于任何类型.

C中,你最好不要memset设置字节值.要初始化除char(ev.unsigned)之外的其他类型的数组,您必须使用手动for循环.

  • @ R.MartinhoFernandes好吧,如果它真的只是一个`unsigned short`数组并且他想把它们初始化为所有`1',那么`memset`*将*工作定义和平台独立,只是它赢了'一般来说*工作**(对于不是全部`1的初始化值,或者像'0`这样的其他琐碎的东西),这就是为什么`std :: fill`当然不能使用它.(我仍然不是说一个可能比另一个更快,我仍然更喜欢`std :: fill`,但只是说在他的情况下`memset`会完美地工作,即使它当然不会一般来说). (2认同)
  • @ R.MartinhoFernandes当然,这就是为什么我说'unsigned short`s'.他可能只是谈论*"16位整数"*,但我有一种强烈的感觉,他真的对"无符号短裤"感兴趣.但好吧,你是对的,因为这个问题并不完全清楚,而且什么时候真的没有用,因为它不会起作用.等等,对不起,我错过了明确说明签名的最新编辑.忘了我的评论. (2认同)

joh*_*ohn 7

-1和0xFFFF在使用二进制补码表示的16位整数中是相同的.你只得到-1,因为你已经声明了你的数组short而不是unsigned short.或者因为您在输出值时将值转换为signed.

顺便说一句你的假设是你可以使用memset 设置除字节之外的东西是错误的.memset(ZBUFFER, 0xFF, size)会做同样的事情.