unsigned

ProtocolBuffer 使用及 一些坑

空扰寡人 提交于 2020-03-09 08:42:56
Protocol Buffers,是 Google公司开发的一种数据描述语言,类似于 XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。 /*--> */ /*--> */ ProtocolBuffer 的优势 跨平台: ProtoBuf 支持多平台和语言, 包括C++/Java/Python 等等 序列化 &反序列号 : ProtoBuf支持直接将对象序列化成 Data, 也支持直接将 Data序列化为对象类型 消息大小 :一条消息数据,用 protobuf序列化后的大小是 json的 10分之一, xml格式的 20分之一,是二进制序列化的 10分之一 . 对于即时通信消息来说, 减小数据量的大小非常有必要 /*--> */ /*--> */ 使用地址: https://github.com/alexeyxo/protobuf-swift 1.ruby -e "$ (curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install )" 2.brew install automake 3.brew install libtool 4.brew install protobuf 5.git clone git@github.com:alexeyxo/protobuf-swift

操作系统

我只是一个虾纸丫 提交于 2020-03-08 16:47:19
一些微小的细节,虽然90%的时间你用不上: 1.溢出 2.舍掉小很多的数 本门课虽然用到汇编,但并不是为了写汇编,而是要读懂c编译后的汇编 本门课的核心是直到怎样利用好分层存储系统,从程序角度了解性能 c没有任何内存保护,因此可能导致不好的bug,需要明白怎样运作 32位机器意味着地址也是32位,64位同理 !、||、&&的特点: 1.将0视为false,任何非0视为true 2.总是返回0或1 3.调用会提前终止 4.这三个都和真正的位计算(~,|,&)不一样 左移<<,右移>>: 算术右移:首位是0,右移后高位填充的就是0,如果是1那就填充1 逻辑右移:高位填充的永远是0 大部分机器做的是算术移位 对于C,无符号数做的是逻辑移位 整数 补码与原码: 对于4、3、2、1、0位,原码(无符号数)对应的是16、8、4、2、1,补码对应的是-16、8、4、2、1(即最高位取相反数),利用这个技巧进行十进制和二进制的转换。同时,据此可以知道n位能表示的十进制数的从负(Tmin)到正(Tmax)的范围,也可以据此知道为什么一个很大的正数突然变成一个负数 该点在java和python不会用到,而c中unsigned是一个明确的数据类型,因此可以在c中声明unsigned long之类的数据类型 这一点用在for循环中极其重要。如果for循环中使用到了unsigned(例如

C语言的整形提升

霸气de小男生 提交于 2020-03-08 13:02:45
1、算术转换   许多运算符都会引发转换,以类似的方式产生结果类型,这个模式称为“寻常算术转换”。   首先,任何类型为char或short的操作数被转换为int,任何类型为float的操作数被转换为double。其次,如果其中一个操作数类型为double,那么另一个操作数被转换为double,计算结果类型也是double。再次,如果其中一个操作数类型为long,那么另一个操作数被转换为long,计算结果类型也为long。或者,其中一个操作数的类型数unsigned,那么另一个操作数被转换为unsigned,计算结果类型也为unsigned。如果不符合上面几种情况,那么两个操作数的类型都为int,计算结果类型也为int。 2、字符和整数   char,short int或int型位段,包括它们的有符号或无符号变形,以及枚举类型,可以使用在需要int或unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。 3、寻常算术转换   许多操作数类型为算术类型的双目运算符会引发转换,并以类似的方式产生结果类型。它的目的是产生一个普遍类型,同时也是运算结果的类型。   首先,如果其中一个操作数的类型是long double,那么另一个操作数也会被转换为long double。其次

c/c++编程排坑(1)-- 数据类型的“安静”转换

家住魔仙堡 提交于 2020-03-08 11:48:21
这里主要介绍ANSI C的特性:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着精度更高、长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned。 一、算术转换(K&R C) 首先: 任何类型为char或short的操作数会被转换为int。 任何类型为float的操作数会被转换成double。 其次: 如果其中一个操作数的类型时double,那么另外一个操作数会被转换成double,计算结果也是double。 如果其中一个操作数的类型时long,那么另外一个操作数会被转换成long,计算结果也是long。 如果其中一个操作数的类型时unsigned,那么另外一个操作数会被转换成unsigned,计算结果也是unsigned。 如果不符合上面几种情况,那么两个操作数的类型都作为int,计算结果也是int。 二、ANSI C的做法 字符和整型(整型升级) char,short int或者int型位段(bit-field),包括他们的有符号和无符号变型,以及枚举类型,可以使用在需要int或unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这称之为整型升级。 寻常算术转换 许多操作数类型为算数类型的双目运算符会引发类型转换

signed和unsigned之二

落爺英雄遲暮 提交于 2020-03-08 11:44:32
先看下面一段程序,这段程序摘自《C 专家编程》: #include <stdio.h> int array[] = {23,34,12,17,204,99,16}; #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) int main(void) { int d=-1,x; /*........*/ if(d <= TOTALTOTAL_ELEMENTS - 2) x = array[d+1]; /*........*/ return 0; } 如果是有这样一段程序的话,你永远无法知道x的值到底是多少,因为这句赋值语句x=array[d+1];根本不会执行。原因在哪?经过调试发现程序执行到if语句进行判断完之后,直接跳过下面一条语句的执行。下面来分析一下原因,因为sizeof求算类型大小时的返回值是unsigned int类型,而d是signed int,if语句测试两者大小,d会自动升级为unsigned int,-1转换为unsigned int是一个很大的正整数,所以表达式的值永远为假,因此后面的赋值语句永远不会执行。这里面就是类型转换带来的bug,如果稍不注意,则可能对整个工程或者项目造成无法预测的后果,而这个bug是很难直接调试能够调试得出来的。 表达式中的类型转换 类型转化包括强制类型转化和隐式转换

C++ 的位运算:__builtin, bitset

风流意气都作罢 提交于 2020-03-08 10:07:54
int __builtin_ffs (unsigned int x) 返回二进制表示中 x 的最后一位 \(1\) (最右边的)是从后向前第几位,比如 \(7368(1110011001000)\) 返回 \(4\) 。 int __builtin_clz (unsigned int x) 返回二进制表示中前导 \(0\) 的个数。 int __builtin_ctz (unsigned int x) 返回二进制表示中末尾 \(0\) 的个数。 int __builtin_popcount (unsigned int x) 返回二进制表示中 \(1\) 的个数。 int __builtin_parity (unsigned int x) 返回 x 的奇偶校验位,也就是 x 的 \(1\) 的个数模 \(2\) 的结果。 这些函数都有相应的 unsigned long 和 unsigned long long 版本,只需在函数名后面加上 l 或 ll 即可,如 int __builtin_clzll bitset 定义在 <bitset> 库中。 bitset<8> b1; // [0,0,0,0,0,0,0,0] bitset<8> b2(42); // [0,0,1,0,1,0,1,0] bitset<17> bs(0xfff0); // [1,1,1,1,1,1,1,1,1,1

C语言代码优化示例(一)

隐身守侯 提交于 2020-03-07 03:55:37
在实际产品的软件开发过程中,很多时候会对代码的性能提出要求,追求最快的速度,提高程序运行效率,改善用户体验等,此时此刻,对代码的优化就非常有必要了,掌握代码的优化方法和技巧就很有必要了。 我们用下面的一段短小的代码为例,来看看优化的过程,并且简略分析一下起优化的原理。 这段代码在CRC的校验中有机会用到,功能是将一个字节的数据逐位的颠倒反转。 //功能: 将数据的位反转,即b0->b7,b1->b6...b7->b0 //des: 转换后的目标buffer //src: 源数据 //len: 数据长度 void Invert8 ( unsigned char * des , unsigned char * src , unsigned int len ) { unsigned char i , j , temp ; for ( j = 0 ; j < len ; j ++ ) { temp = 0 ; for ( i = 0 ; i < 8 ; i ++ ) { if ( ( * src ) & ( 1 << i ) ) temp | = 1 << ( 7 - i ) ; } * des = temp ; des ++ ; src ++ ; } } 我们先第一遍运行,看看这个常规写法的运行时间是多少(CPU速度72MHz) 调用:Invert8(dst,src,100);

Linux设备驱动程序学习(10) -时间、延迟及延缓操作

僤鯓⒐⒋嵵緔 提交于 2020-03-06 08:46:15
度量时间差 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 <linux/param.h>中定义或该文件包含的某个子平台相关文件中。作为通用的规则,即便如果知道 HZ 的值,在编程时应当不依赖这个特定值,而始终使用HZ。对于当前版本,我们应完全信任内核开发者,他们已经选择了最适合的HZ值,最好保持 HZ 的默认值。 对用户空间,内核HZ几乎完全隐藏,用户 HZ 始终扩展为 100。当用户空间程序包含 param.h,且每个报告给用户空间的计数器都做了相应转换。对用户来说确切的 HZ 值只能通过 /proc/interrupts 获得:/proc/interrupts 的计数值除以 /proc/uptime 中报告的系统运行时间。 对于ARM体系结构:在<linux/param.h>文件中的定义如下: #ifdef __KERNEL__ # define HZ CONFIG_HZ /* Internal kernel timer frequency */ # define USER_HZ 100 /* 用户空间使用的HZ,User interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ #else # define

C++错误:Process returned -1073741571 (0xC00000FD)

房东的猫 提交于 2020-03-06 06:21:48
最近写程序时,需要将一个一维数组编程二维数组,很简单,写完之后,运行错误! 提示:Process returned -1073741571 (0xC00000FD) 刚开始写的代码如下: #include <iostream> using namespace std; int main() { unsigned short frame[1000000] = {0}; unsigned short frame2[10][100000]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 100000; j++) { frame2[i][j] = frame[i + j * 10]; } } } 纠结了我好长时间。。。 问题所在: 栈的默认内存空间为1M左右,所以会导致内存溢出。 也就是数组定义的太大了。 解决方法: 声明成全局或static的,这两种变量不压栈。 代码: 把数组声明为static,就没有问题了 #include <iostream> using namespace std; int main() { static unsigned short frame[1000000] = {0}; static unsigned short frame2[10][100000]; for (int i = 0; i < 10;

shift count is too large

一笑奈何 提交于 2020-03-05 16:25:05
STM8S是8 bit单片机 在STM8S中 unsigned long是32位, unsigned short和unsigned int都是16位,unsigned char是8位。 以以下代码编译时报了“shift count is too large”的warning, 并且代码执行时也没有达到预期效果: 1 unsigned char temp[4]; 2 unsigned long pd_reg; 3 ... 4 pd_reg = temp[3] << 24 | temp[2] << 16 | temp[1] << 8 | temp[0]; 后面加上了强制类型转换解决了此问题: 1 unsigned char temp[4]; 2 unsigned long pd_reg; 3 ... 4 pd_reg = (unsigned long)temp[3] << 24 | (unsigned long)temp[2] << 16 | (unsigned long)temp[1] << 8 | (unsigned long)temp[0]; 来源: https://www.cnblogs.com/wanglouxiaozi/p/12420745.html