jjzjj

c++ - unsigned long 的类型不同于 Windows 上的 uint32_t 和 uint64_t (VS2010)

在Windows7、32位的VisualStudio2010上,unsignedlong似乎是与uint32_t和uint64_t截然不同的类型。看下面的测试程序:#include#includetemplatestructis_same_type{staticconstboolvalue=false;};templatestructis_same_type{staticconstboolvalue=true;};#defineTO_STRING(arg)TO_STRING_IMPL(arg)#defineTO_STRING_IMPL(arg)#arg#definePRINT_SAME

c++ - 如何从 uint32_t 打印十六进制?

我一直在处理的代码要求我以十六进制打印类型为uint32_t的变量,填充为0,最小长度为8。到目前为止,我一直在使用该代码来执行此操作是:printf("%08lx\n",read_word(address));其中read_word返回类型uint32_t。我用过jx,llx等格式都没有用,请问有正确的格式可以用吗?编辑:我发现问题出在我传递的内容上。函数read_word从uint32_tvector返回一个值。似乎这是导致十六进制问题的问题。这是按引用/值传递的问题吗?如何解决?读字函数:uint32_tmemory::read_word(uint32_taddress){if(

c++ - 如何将每一位变成一个字节

我有以下代码可以将位转换为字节。__device__UINT64bitToByte(constUINT8input){UINT64b=((0x8040201008040201ULL*input)>>7)&0x0101010101010101ULL;//reversethebyteorder但是字节的顺序是错误的,字节序是颠倒的。在CPU上,我可以简单地使用bswapreg,reg来解决这个问题,但是我在GPU上该怎么办?或者,我可以使用什么类似的技巧来使字节以正确的方式放置,即最高有效位转到最高有效字节,这样我就不需要bswap技巧。 最佳答案

c++ - g++-8 和早期版本之间的奇怪行为

最近,在将我们的应用程序从gcc-5.3移植到8.2时,我们注意到一个奇怪的行为破坏了我们的应用程序。简而言之,gcc-8.2似乎删除了我们的“比较2个无符号整数的if分支”之一,甚至没有发出警告。我们用相同的编译选项尝试了g++5.3、g++7.4和g++8.2,只有g++8.2有这个问题。下面将展示一个简短的例子。#include#include#include#includeusingnamespacestd;structmyunion{myunion(uint32_tx){_data.u32=x;}uint16_thi()const{return_data.u16[1];}ui

c++ - uint8_t 和 unsigned char 链接错误

我正在使用模板函数:templatevoidfunc(constT&value){obj->func(value);}其中obj是类的对象:voidmy_object::func(int64_tvalue){...}voidmy_object::func(uint64_tvalue){...}voidmy_object::func(uint32_tvalue){...}voidmy_object::func(uint16_tvalue){...}voidmy_object::func(uint8_tvalue){...}问题在于uint8_t重载了my_object::func()覆盖

c++ - RAND_MAX 和 UINT_MAX 之间的差异会有所不同吗?

我的作业涉及生成0和2^30之间的随机整数。现在,在过去我们了解到rand()只返回小于RAND_MAX的整数,这小于UINT_MAX,并且我们可以使用位移来填充UINT_MAX容量。从我所做的一些阅读中(这里,关于SO),我意识到如果这些数字的分布对我很重要,这可能不是一个好主意。话虽如此,我的教授已经指定了这种方法。我的问题是,位移多少?RAND_MAX和UINT_MAX之间的差异是否始终存在一个安全常数来进行位移?或者是否需要进行一些初始探测以确定要移位的数字?我是否应该保持位移一点点并检查UINT_MAX?我问的原因是,UINT_MAX被定义为至少是某个数字(65535),但在

c++ - 检查是否定义了 uint64_t

uint64_t类型不能保证在32位平台上定义,并且代码如下intmain(){uint64_ti=0;}可能会导致不完整类型的编译错误。是否有预处理器指令来检查uint64_t是否存在?还有其他方法可以检查类型是否已定义吗? 最佳答案 我认为合理的方法是检查关联的宏是否UINT64_MAX已定义,例如#include/*don'tforgettoinclude*/...#ifdefUINT64_MAX...#endif据我所知,您无法直接检查是否定义了某种类型的同义词。根据C99,7.18.2Limitsofspecified-w

c++ - AVX 4 位整数

我需要执行以下操作:w[i]=scale*v[i]+pointscale和point是固定的,而v[]是一个4位整数vector。我需要为任意输入vectorv[]计算w[]并且我想使用AVX内在函数来加速这个过程。但是,v[i]是一个4位整数vector。问题是如何使用内在函数对4位整数执行运算?我可以使用8位整数并以这种方式执行操作,但有没有办法执行以下操作:[a,b]+[c,d]=[a+b,c+d][a,b]*[c,d]=[a*b,c*d](忽略溢出)使用AVX内在函数,其中[...,...]是8位整数,a、b、c、d是4位整数?如果是,是否可以举一个简短的例子来说明它是如何工作

c++ - 在 C++ 中将 uint8_t* 转换为 std::string?

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:HowtoConvertByte*tostd::stringinC++?我在嵌入式设备上尝试接收消息。此消息由constuint8_t*data及其长度size_tlen给出。现在我需要一个std::string来输出我的数据。

c++ - 将位移动到掩码中给定位置的快速方法

我正在寻找一种快速迭代掩码中设置的所有可能位分配的方法。例子:掩码=0b10011结果={0b00000,0b00001,0b00010,0b00011,0b10000,0b10001,0b10010,0b10011}我需要遍历所有这些。目前我使用与此类似的代码,效果很好:intcount=popCount(mask);uint64_tnumber=0;for(uint64_tnumber=0;number>1;//make2ndlsbthenextonetocheck}returnresult;}shiftBit示例:mask=0b10011001number=0b1010=0b10