char

理解有符号数和无符号数

陌路散爱 提交于 2020-02-28 04:10:10
http://www.cnblogs.com/lazycoding/archive/2011/03/21/unsigned-signed.html 声明网上看到的文章,原文找不到了,原文被转载的不成样子,重复很多,整理花了很长时间,在翻看了维基百科后发现,原文中对于负数原码和补码存在一些问题,修改了一部分,原作者看到后可以联系我。 1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型。 (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。 字符类型也分为有符和无符类型。 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 2、使用二制数中的最高位表示正负。 首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。 (红色为最高位) 单字节数: 11111111 双字节数:

C++ Primer Answer ch04

自作多情 提交于 2020-02-28 03:18:02
4.1 #include <iostream> using namespace std; int main() { cout << 5 + 10 * 20 / 2;//105 return 0; } 4.2 #include <iostream> #include <vector> using namespace std; int main() { vector<int> vec = {1, 3, 5}; cout << *vec.begin() << ' '; cout << *(vec.begin()) << ' '; cout << *vec.begin() + 1 << ' '; cout << (*(vec.begin())) + 1; return 0; } 4.3 可以。操作数的求解顺序通常对结果没什么影响,只有当二元操作符的两个操作数涉及同一对象,并改变对象的值时,操作数的求解顺序才会影响计算结果。实现效率的提高能使使用编译器的程序受益。 4.4 #include <iostream> using namespace std; int main() { cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;//91 return 0; } 4.5 #include <iostream> using namespace std; int

c++ sizeof对象大小整理

时间秒杀一切 提交于 2020-02-28 00:57:43
1. sizeof 是运算符,而不是函数。 2. 当sizeof 的对象是表达式时,求的大小是表达式返回值的类型大小,但并不计算表达式的值,比如: 1 char c = 1; 2 int i = 2; 3 cout << sizeof(c + i) << endl; 4 cout << sizeof(c = c + i) << endl; 前者c + i会隐式类型转化为int类型(类型提升),因此返回4(32位系统), 而后者虽然运算时也是转化为int,但赋值给c时又会转化为char,因此返回的是1。 3. 如果对象是函数,则返回函数返回值类型大小,如: 1 long long foo() 2 { 3 cout << "foo() has been called" << endl; 4 return 0; 5 } 6 7 int main(int argc, char **argv) 8 { 9 cout << sizeof(foo()) << endl; 10 return 0; 11 } 执行后输出8, 不会输出 foo() has been called.说明函数没有真正执行,而只是判断了下返回类型。 4. 当sizeof的对象是数组时,返回 数组总大小 ,而当对象是指针时,返回 指针本身的大小 ,而不是指示内存空间的大小。因为指针本身就是一个无符号整型数, 因此int *p

Tiny-shell

痞子三分冷 提交于 2020-02-27 21:04:03
Tiny-shell:一个模仿bash的极简shell (一) 概述 通过构建一个简单的shell,能够对shell的工作原理进行一些了解。主要有: 重定向 流水线 前台信号处理 进程组 后台进程 作业控制 这篇文章里先实现一个极简的shell,后续再不断对功能进行完善添加。 思路 在 main 函数里,我们需要一个循环来一直进行输出,打印shell的提示符,用于提示命令的输入。同时,我们需要对从标准输入的命令进行处理,也就是字符串的处理。当按下回车时,需要我们 fork 出一个子进程,并调用 execvp 来执行处理过的命令。然后 main 函数 wait 子进程执行完毕继续打印新的一行提示符即可。这就是一个极简的shell。 函数说明 make_argv 首先我们需要写一个处理字符串的函数 int make_argv(const char *s, const char *delimiters, char ***argvp) 。 s 即是我们传入的字符串,比如 ls -l ,我们要做的就是将此字符串处理成一个参数数组,便于传递给 int execvp(const char *file, char *const argv[]) 。函数中主要涉及用 strtok 来进行处理。 execute_cmd 这个函数用于调用 make_argv ,并进行检错,然后调用 execvp 。

Appgamekit常用指令1(c++版)

邮差的信 提交于 2020-02-27 20:14:10
1.void agk::Sync(); 刷新屏幕。 2.int agk::GetDeviceHeight(); 返回设备屏幕的高度。 3.int agk::GetDeviceWidth(); 返回设备屏幕的宽度。 4.float ScreenFPS(); 返回fps,即每秒平均帧数。 5.void agk::SetSyncRate( float fps, int mode=0 ); 设置刷新模式。 参数:fps用来设置最大的每秒帧数。mode中0节省cpu电池,1的性能更好,消耗cpu较大。 6.void agk::SetWindowTitle( const char* szTitle ); 设置窗口标题。 7.char* agk::Str( float value ); char* agk::Str( float value, UINT decimals ); char* agk::Str( int value ) 三个重载函数。 将浮点型数据转换为字符串。 将浮点型数据转换为指定小数点位数的字符串。 将整型数据转换为字符串。 参数:decimals代表小数点后的位数 8.void agk::SetVirtualResolution( int iWidth, int iHeight ); 设置虚拟分辨率为iWidth*iHeight 9.void agk:

sort函数

梦想与她 提交于 2020-02-27 19:39:33
做项目的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。 sort是STL中提供的算法,头文件为#include<algorithm>以及using namespace std; 函数原型如下: ? 1 2 3 4 5 template < class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last ); template < class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); 使用第一个版本是对[first,last)进行升序排序,默认操作符为"<",第二个版本使用comp函数进行排序控制,comp包含两个在[first,last)中对应的值,如果使用"<"则为升序排序,如果使用">"则为降序排序,分别对int、float、char以及结构体排序例子如下: ? 1 2 3 4 5 6 7 8 9

stdlib.h,stdio.h,string.h头文件

眉间皱痕 提交于 2020-02-27 18:30:18
一、定位不同 1、stdlib.h是standard library标准库头文件,定位在通用工具函数。 2、stdio.h是standard input&output标准输入输出头文件,定位在标准的输入输出工具函数。 二、封装函数不同 1、stdlib.h主要封装了malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等函数。 2、stdio.h主要封装了getchar()、putchar()、scanf()、printf()、gets()、puts()、sprintf()等函数。 三、定义类型不同 1、stdlib.h定义了size_t、wchar_t、div_t、ldiv_t和lldiv_t五种类型。 2、stdio没有定义类型 扩展资料: stdlib.h包含的函数 输入样式:C语言模式:#include <stdlib.h> C++样式:#include 1、函数名称: exit 函数原型: void exit(int state) 函数功能: 程序中止执行,返回调用过程 函数返回: 参数说明: state:0- 正常中止,非 0- 非正常中止 2、函数名称: getenv 函数原型: char* getenv(const char *name) 函数功能:

理解Android线程创建流程

百般思念 提交于 2020-02-27 17:35:41
copy from : http://gityuan.com/2016/09/24/android-thread/ 基于Android 6.0源码剖析,分析Android线程的创建过程 /android/libcore/libart/src/main/java/java/lang/Thread.java /art/runtime/native/java_lang_Thread.cc /art/runtime/native/java_lang_Object.cc /art/runtime/thread.cc /system/core/libutils/Threads.cpp /system/core/include/utils/AndroidThreads.h /frameworks/base/core/jni/AndroidRuntime.cpp 一.概述 Android平台上的Java线程,就是Android虚拟机线程,而虚拟机线程由是通过系统调用而创建的Linux线程。纯粹的Linux线程与虚拟机线程的区别在于虚拟机线程具有运行Java代码的Runtime. 除了虚拟机线程,还有Native线程,对于Native线程有分为是否具有访问Java代码的两类线程。接下来,本文分析介绍这3类线程的创建过程。 二. Java线程 2.1 Thread.start [-> Thread

C语言变量

谁说胖子不能爱 提交于 2020-02-27 15:18:18
C语言变量 任何一种编程语言都离不开变量,特别是数据处理型程序,变量的使用非常频繁,没有变量参与程序甚至无法编制,即使编制运行后的意义也不大。变量之所以重要,是因为变量是编程语言中数据的符号标识和载体。 C语言是一种应用广泛的善于实现控制的语言,变量在C语言中的应用更是灵活多变。那么变量究竟是什么呢?变量是内存或寄存器中用一个标识符命名的存储单元,可以用来存储一个特定类型的数据,并且数据的值在程序运行过程中可以进行修改。可见,变量首先是一个标识符或者名称,就像一个客房的编号一样,有了这个编号我们在交流中就可方便言表,否则,我们只可意会,那多不方便。为了方便,我们在给变量命名时,最好能符合大多数人的习惯,基本可以望名知义,便于交流和维护;其次,变量是唯一确定的对应内存若干存储单元或者某个寄存器。这些是编译器来保证的,用户一般不用费心。 程序员一旦定义了变量,那么,变量就至少可为我们提供两个信息:一是变量的地址,即就是,操作系统为变量在内存中分配的若干内存的首地址;二是变量的值,也就是,变量在内存中所分配的那些内存单元中所存放的数据。 由于程序的多样需要,我们对变量也有各种各样的要求,比如:变量的生命期,变量的初始状态,变量的有效区域,变量的开辟地和变量的开辟区域的大小等等;为了满足这些要求,C语言的发明者就设置了以下变量: 1、 不同数据类型的变量;如:char cHar, int

多线程读写锁

不打扰是莪最后的温柔 提交于 2020-02-27 15:03:12
package com.thread.ch6; public class ReadWriteLock { //正在读的用户数 private int readingReaders = 0; //等待读的用户数量 private int waitingReaders = 0; //正在写的用户数量 private int writingWriters = 0; //等待写的用户数量 private int waitingWriters = 0; private boolean preferWriter = true; public ReadWriteLock() { this(true); } public ReadWriteLock(boolean preferWriter) { this.preferWriter = preferWriter; } public synchronized void readLock() { //读的人加1 this.waitingReaders++; try { //当写的人数大于0 或者偏向写为true 且等待写的人数大于0 则当前读等待 while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) { this.wait(); } this.readingReaders+