草庐IT

c++ - 从 int 到 uint8_t 的隐藏缩小转换

考虑以下代码:#includeclassA{public:explicitA(uint8_tp_a){m_a=p_a;};uint8_tget_a()const{returnm_a;}private:uint8_tm_a;};intmain(){Aa{0x21U};Aaa{0x55U};uint8_tmask{a.get_a()|aa.get_a()};return0;}当我尝试编译这个(gcc5.4.0)时,我得到以下错误:main.cpp:Infunction‘intmain()’:main.cpp:20:28:warning:narrowingconversionof‘(int)

c++ - 在 C++11 中可移植地打印 std::uint64_t 变量的格式说明符

打印std::uint64_t类型值的格式说明符是什么?(来自)使用来自std::printf()的函数C++中的家庭?C99有PRIu64(来自)但我并不完全清楚PRIu64是有效的C++11,虽然我能找到它可能是的提示。没有PRIu64,据我所知,没有一种格式说明符适用于所有情况:在32位平台上,std::uint64_t将被定义为unsignedlonglong并且格式说明符将为%llu.在64位平台上,std::uint64_t将被定义为unsignedlong并且格式说明符将为%lu.但是对于VisualStudio,%llu在这两种情况下都有效。

c++ - uint64_t t3 = MAXDWORD + 1 == 0?

我真的不明白下面的代码发生了什么。为什么t3为零?uint64_tt1=MAXDWORD;//t1contains4294967295-CORRECTuint64_tt2=t1+1;//t2contains4294967296-CORRECTuint64_tt3=MAXDWORD+1;//t3contains0(zero)-HUH?? 最佳答案 decltype(MAXDWORD)是比uint64_t更窄的类型。所以表达式MAXDWORD+1也不是uint64_t,unsigned环绕行为在赋值之前被观察到到t3。t1+1使用uin

c++ - 仅使用位操作(无分支)将 16 位有符号值限制在 0 到 4095 之间

我想将signedshort变量的值限制在0到4095之间,之后我将最高有效的8位作为最终值用于其他地方。现在我正在以如下基本方式进行操作:shortcolor=/*someexternalsource*/;/**Igetthecolorvalueasa16bitsignedintegerfroman*externalsourceIcannottrust.16bitsarebeingusedhere*forhigherprecision.*/if(color4095){color=4095;}unsignedcharcolor8bit=0xFF&(color>>4);/**color8

c++ - uint8_t 到 sint8_t 的转换

在可移植C中将“uint8_t”转换为“sint8_t”的最佳方法是什么。这就是我想出的代码....#includesint8_tDESER_SINT8(uint8_tx)(return(sint8_t)((x>=(1u有更好/更简单的方法吗?也许是一种不使用条件的方法?编辑:谢谢大家。所以总而言之,我已经学到了什么......sint8_t真的叫int8_t128由1表示而不是12s的补码是“减一”:)所以这是我原始代码的更新版本:#includeint8_tDESER_INT8(uint8_tx)(return((x>=(1 最佳答案

C++:malloc:错误:从 ‘void*’ 到 ‘uint8_t*’ 的无效转换

我遇到了这个问题:invalidconversionfrom‘void*’to‘uint8_t*’执行此操作时:intnumBytes;uint8_t*buffer;buffer=malloc(numBytes);//errorhere,why?还是我必须这样说?buffer=malloc(numBytes);请解释一下。 最佳答案 您不能在C++中从void*隐式转换(在这方面与C不同)。你可以这样做:buffer=static_cast(malloc(numBytes));但实际上,您应该只使用new/delete而不是mall

c++ - uint32_t 和 uint8_t[4] 未定义行为的 union ?

这个问题在这里已经有了答案:PurposeofUnionsinCandC++(16个答案)关闭8年前。在thisanswer的评论中据说使用如下union将整数拆分为字节是未定义的行为。那个地方给出的代码与此类似但不完全相同,如果我更改了代码的未定义行为相关方面,请注明。unionaddr{uint8_taddr8[4];uint32_taddr32;};到目前为止,我认为这是一种很好的方法来执行addr={127,0,0,1};并在中获取相应的uint32_t返回。(我承认这可能会产生不同的结果,具体取决于我的系统的字节序。但是问题仍然存在。)这是未定义的行为吗?如果是这样,为什么?

c++ - 将 uint64_t 转换为 double 后出现意外结果

在下面的代码中:#include...uint64_tt1=1510763846;uint64_tt2=1510763847;doubled1=(double)t1;doubled2=(double)t2;//d1==t2=>evaluatestotruesomehow?//t1==d2=>evaluatestotruesomehow?//d1==d2=>evaluatestotruesomehow?//t1==t2=>evaluatestofalse,ofcourse.std::cout我得到这个输出:uint64_t:1510763846,1510763847,double:151

c++ - 无法播放视频 Qt5 多媒体 ubuntu 16.04

我正在尝试使用QMediaPlayer类来播放视频,但一直出现此错误-`GLib-GObject-WARNING**:cannotregisterexistingtype'GstObject'GLib-CRITICAL**:g_once_init_leave:assertion'result!=0'failedGLib-GObject-CRITICAL**:g_type_register_static:assertion'parent_type>0'failedGLib-CRITICAL**:g_once_init_leave:assertion'result!=0'failedGSt

c++ - 完全模拟缺失的不同内置类型(特别是 : char16_t and char32_t)

C++11有两种新的字符整型数据类型,char16_t和char32_t。我想为没有不同类型的编译器模拟它们,以便重载I/O操作以将它们视为字符而不是整数值。这些是要求:不同(无typedef)。普通系统上的精确宽度(alauint16_t和uint32_t)允许使用其他C++11功能(见下文第一次尝试)必须善于处理文字;char16_tc16=u"blablaunicodetextblabla";必须有效。如果char16_t可以用于数学运算符,显然这也需要起作用。我在文字部分失败的第一次尝试是强类型枚举:enumchar16_t:uint16_t;这也有其他缺点,也许可以通过自己提