2.sizeof和strlen的区别 然后说一下sizeof和strlen的区别,可能有很多萌新记不住这两个的区别: sizeof() 是运算符,它不是函数,不要因为它长的像函数,就上它的当,sizeof...其值在编译时就已经计算好了,参数可以是数>组,指针,对象,函数等等,它的功能就是获取数组,指针等类型的字节大小。...* _Str); 该函数的功能是返回字符串的长度,该字符串可能是自己定义的,也可能是内存中随机存储的,该函数实际完成的功能是从代>表该字符串的第一个地址开始遍历,知道遇到结束符NULL,返回的长度不包括...2.如果不为1,则有符号数就直接等于无符号数。 3.如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。...举个例子: 无符号数10转换为有符号数 无符号数10的二进制写法:0000 1010 根据三步法得到: 有符号数10的二进制写法:0000 1010 还是10 无符号数129转换为有符号数
信息的表示和处理 MSB:most significant bit(最高有效位) LSB:least significant bit(最低有效位) 1.1 进制表示 二进制数用后缀字母 B 十六进制数用后缀字母...1.4 类型转换 有符号数和无符号数的转换规则: 位模式不变、数值可能改变(按不同编码规则重新解读) 隐式转换 有符号数隐式转换为无符号数 当表达式中有符号和无符号数混用时,包括比较运算符连接的表达式...image.png 符号扩展 对于给定 w 位的有符号整型数 x 转为 w+k 位相同数值的整型数,将符号位复制 k 份 C 语言中从短整数类型向常整数类型转换时自动进行符号扩展 image.png...有符号数加法 image.png image.png 【注】CPU 其实并不知道操作的是有/无符号数,CPU 所做的便是将两个 w 位的二进制数 x、y 相加并将结果的进位 w+1 位去掉(即只保留结果的后...跳转表通过将需要执行的分支地址组合成一个数组,然后根据 switch 中的值用于该数组的索引下标,从而实现跳转只需要使用 jmp 指令的间接跳转到相应的分支。
上图是32位和64位典型值,整数或者有符号的,即可以表示负数,零和正数;无符号的只能表示非负数 寻址和字节顺序 在大多数计算器上,对于多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址...(右边补符号位) 现在几乎所有的编译器或者机器组合都对有符号使用算术右移面对无符号数,右移必须是逻辑的 整数的表示 我们对整数主要分为:有符号和无符号 先记一些术语: ? ...的值为7 其实这个时候还有一个有意思的点是,如果就是这个4位的话,表示-1 的表示方式: 二进制形式为:1111 发现其实和 最大的无符号数的表示方式是一样的 所以在c语言中,假设我们定义了一个无符号的数...,而结果是以补码表示的 同样的对于0-UMax 之间的值x ,定义函数U2T 为U2T = B2T 生成一个数的无符号表示和x的补码表示相同 ?...,避免这类错误的一种方法就是绝对不使用无符号数,而实际上除了C以外也很少语言支持无符号整数
其实答案很简单,因为计算机是采用数字电路进行逻辑运算最终实现我们的功能的,而对于一条电路而言,它的电位只有高低两种电平,或者理解为只分为有电流和无电流通过。因此使用0和1作为标识是非常实用的。...既然二进制如此美妙好用,为什么各位计算机学家还是要在计算机大量的使用八进制和十六进制呢?...正负数存储形式及四种码 在计算机中,数据往往并不是直接以数值本身的二进制码(机器数)进行存储和计算的,我们往往需要对数值的二进制码进行一些变换。...当有符号数向无符号数进行转换时,我们需要计算出有符号数的补码,然后直接按公式进行计算。...使用运算符重载,计算向量的加减和点乘(内积) Reference 《C# in Depth》—— Jon Skeet 《计算机组成原理》——唐朔飞 C#托管堆和垃圾回收(GC) C# Heap(ing)
当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要以补码的形式存储。...二进制转成十进制的基本方法:权值法 将一个二进制数依次从末尾开始乘以2的n次方相加,n从0开始。...八进制的数和二进制数可以按位对(八进制一位对应二进制三位),因此常应用在计算机语言中。...十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中。 八进制的数和二进制数可以按位对(八进制一位对应二进制三位),因此常应用在计算机语言中。...(2).无符号数:无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。 (3).数值溢出:当超过一个数据类型能存放的最大范围时,数值会溢出。
操作符的分类:算数操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、(下标引用、函数调用和结构成员)。...因此,对于有符号数而言,逻辑位移没有太大意义,如果一个负数,逻辑右移,结果就会变成正数。如果想达到逻辑右移的效果,可以使用强制类型转换将有符号数转换为无符号数,然后进行逻辑右移操作。...//sizeof还有下面的用法 printf("%d\n",sizeof(int [10])) ;//int [10]是arr数组的类型 下面给大家带来一道习题: 在这个题目中,sizeof计算的是...~:对一个数的二进制位按位取反 ++、--分为两种情况:前置++、-- ——先使用,再计算 后置++、-- ——先计算,再使用 下面给出实例...十、下标引用、函数调用和结构成员 其中下标引用和函数调用我们都已经非常熟悉了,但还是要注意以下两点: 数组中元素的下标是从零开始的 ;函数调用时后面的()不论是传参还是不传参都要带上,例如Add()
数值类型之间的转化 整型之间的转化 关于数值类型之间的转化,我们前面在介绍运算符的时候已经提到过,在进行类型转化时只需要调用要转化的数据类型对应的函数即可: v1 := uint(16) // 初始化...原码、反码和补码 计算机底层是通过二进制表示数字的,我们把这种二进制形式的数字称之为机器数,数字是有正负之分的,这个正负是通过机器数的第一位作为标识的(俗称符号位):0 表示正数,1 表示负数。...为区别有符号数真实值与形式值的不同,又将带符号位的机器数对应的真正数值称为机器数的真值(无符号数的真值就是自身)。 除了基本的二进制数字外,计算机还提供了三种数字编码方式:原码、反码和补码。...255 是无符号正数,补码和原码都是 255,即 16 个 1 组成的机器数,转化为 int8 类型后,由于 int8 只能存放 8 位机器数,所以会截取 255 后 8 位数字,也就是 1111 1111...如果要实现更强大的基本数据类型与字符串之间的转化,可以使用 Go 官方 strconv 包提供的函数: v1 := "100" v2, _ := strconv.Atoi(v1) // 将字符串转化为整型
常见位运算总结: 1、基础位运算 左移<<运算 将二进制数向左移位操作,高位溢出则丢弃,低位补0。 右移>>运算 右移位运算中,无符号数和有符号数的运算并不相同。...对于无符号数,右移之后高位补0;对于有符号数,符号位一起移动,正数高位补0,负数高位补1 按位与&运算 有0就是0,巧计:&这个符号像是有两个0组合而成。...位1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 解析: 只需要每次右移&1判断是否为1。...汉明距离 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y,计算并返回它们之间的汉明距离。...两整数之和 给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。 思路: 我们前面介绍了^运算的另一个功能是不进位相加,因此我们可以利用这个特性去解决这道题。
有符号数的计算在 Verilog 中是一个很重要的问题(也很容易会被忽视),在使用 Verilog 语言编写 FIR 滤波器时,需要涉及到有符号数的加法和乘法,在之前的程序中我把所有的输入输出和中间信号都定义成有符号数...,有符号数和无符号数实际上是同一个数,只看我们怎么定义它,比如乘积是 16 位的二进制 16’b1100_0000_0000_0011,当我们认为它是无符号数是,最高位的 1 就不是符号位,而是 2^15...对上图分析: (1) 在 0 ~ 400 ns,仿真中使用十六进制赋值相同的十六进制数据给乘数,让乘数分别以无符号数和有符号数进行读取,可以看到对 8’hff(对应二进制 8’b1111_1111)以无符号数读取时是按照..._010 的计算结果和 data_out_000 完全一致,它们都是把赋值的 8 位十六进制数当做无符号数计算的(这里不存在十进制到二进制原码、补码换算的问题,因为给的是十六进制); 当后面设计输入输出时...有符号数,计算时默认是按照无符号数计算(实际上我感觉是把读取到的 8 位二进制数当做原码去算),此时若外部传入的数据实际上是有符号数(比如 FIR 滤波器传入了正负均有的待滤波信号),那么需要对符号位进行扩展来计算乘法和加法
,无符号数只能表示0和正整数,不能表示负数 signed和unsigned的区别:signed的好处是既可以表示正数又可以表示负数,而unsigned的好处是,在相同类型的情况下使用它,那么该数据类型可以表示的正整数的大小是...%d,具体占位符的作用和介绍将在介绍函数printf时细讲,请耐心观看 四、二进制转十进制、无符号数和有符号数以及数据类型的取值范围 在学习数据类型的取值范围前,我们必须知道二进制如何转十进制,采用的方法就是按权展开法...,就是按二进制每一位的权重相加进行展开,二进制的权重如下图: 要计算它的大小只需一位一位相加,例如二进制数10110111转为十进制数的方法如图: 我们还需要了解什么是有符号数,什么是无符号数...: (1)无符号数(unsigned number):是相对于有符号数而言的,指的是全部二进制位均表示数值位,相当于数的绝对值,比如上图的10110111就是一个无符号数 (2)有符号数中左边第一位表示符号位...,比如长整型占8个字节的空间,也就是64位二进制数,实在太大了,不好计算,所以我们只需要知道数据类型的取值范围的计算方法,以及一些简单的数据类型的取值范围即可,如何查看它们呢?
十进制与二进制数之间的转换 用计算机处理十进制数时,必须先把它转化为二进制数才能被计算机所接受;同理,计算结果应该将二进制数转换成人们习惯的十进制数。...计算机中的数字电路只能直接识别二进制数据,数的正(+)、负(-)号是不能被计算机识别的,为了让计算机能识别正、负号,就必须对符号进行编码,或者说把符号数字化。...通常采用二进制数的最高位来表示符号,用 ”0“ 表示正数,”1“ 表示负数。 整数的表示 整数可分为无符号整数和有符号整数。...在计算机中一个浮点数由指数(阶码)和尾数两部分组成,阶码部分由阶符和阶码组成,尾数部分由尾符和尾数组成。其机内表示形式如下: ?...只要一种加法电路就可以处理各种有符号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路和补码电路即可以完成各种有符号数加法和减法,在电路设计上相当方便。
字符型:char 实型(浮点型):float、double 类型限定符 字符串常量 C语言常见函数 system函数 printf函数和putchar函数 scanf函数与getchar函数 随机数相关...字符串处理函数 C语言运算符与表达式 类型转换 C语言的数组和字符串 数组相关 字符数组与字符串 C语言函数部分 C语言的多文件编程 C语言的指针 C语言的内存管理 C语言的复合类型(自定义类型) C...进制表示 C语言表示相应进制数: 进制 描述 十进制 以正常数字1-9开头,如123 八进制 以数字0开头,如0123 十六进制 以0x开头,如0x123 二进制 C语言不能直接书写二进制数 sizeof...无符号数 无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。 当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。...C语言函数部分 从函数定义的角度看,函数可分为系统函数和用户定义函数两种: 系统函数,即库函数:这是由编译系统提供的,用户不必自己定义这些函数,可以直接使用它们,如我们常用的打印函数printf()。
工具gcc编译器VS2019 C语言编译过程C语言代码主体必要内容 C语言数据类型关键字常量变量进制表示sizeof 关键字整型:intshort、int、long、long long有符号数和无符号数字符型...:char实型(浮点型):float、double类型限定符字符串常量 C语言常见函数system函数printf函数和putchar函数scanf函数与getchar函数随机数相关字符串处理函数...进制表示 C语言表示相应进制数: 进制描述十进制以正常数字1-9开头,如123八进制以数字0开头,如0123十六进制以0x开头,如0x123二进制C语言不能直接书写二进制数 sizeof 关键字 ...无符号数 无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。 当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。 ...C语言函数部分 从函数定义的角度看,函数可分为系统函数和用户定义函数两种: 系统函数,即库函数:这是由编译系统提供的,用户不必自己定义这些函数,可以直接使用它们,如我们常用的打印函数printf()
有符号整数采用2的补码形式表示,也就是最高位bit位用来表示符号位,一个n-bit的有符号数的值域是从 到 之间。...它使用了Printf函数的%b参数打印二进制格式的数字;其中%08b中08表示打印至少8个字符宽度,不足的前缀部分用0填充 var x uint8 = 1<<1 | 1<<5 var y uint8 =...>>n移位运算中,决定了移位操作的bit数部分必须是无符号数;被操作的x可以是有符号数或无符号数。...尽管Go语言提供了无符号数的运算,但即使数值本身不可能出现负数,我们还是倾向于使用有符号的int类型,就像数组的长度那样,虽然使用uint无符号类型似乎是一个更合理的选择。...事实上,内置的len函数返回一个有符号的int,我们可以像下面例子那样处理逆序循环(笔者觉得数组的长度使用int型是基于长度不可能是一个负值这样的自然逻辑)。
空类型 : (调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。其类型说明符为void。)...八进制数通常是无符号数。...八进制无符号数的表示范围为0~0177777 十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。 长整数158L和基本整常数158 在数值上并无区别。...因此在运算和输出格式上要予以注意,避免出错。 无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。... 正数的补码和原码相同; 负数的补码:将该数的绝对值的二进制形式按位取反再加1。
右移运算符>> 右移运算符是a>>2表示将a的各二进制位右移2位,移到右端的低位被舍弃,对无符号数,高位补0。...有关符号位的注意事项如下: 对无符号数,右移时左边高位移入0; 对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0; 如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统...例如,a的值是十进制数-2: a = 1111 1110(用二进制形式表示); 无符号数:a>>1 = 0111 1111 (逻辑右移时); 有符号数:a>>1 = 1111 1111 (算术右移时...a >> 1; b = b >> 1; printf("a = %d\nb = %d\n", a, b); return 0; } 打印: a = 127 b = -1 显然,C语言对于有符号数和无符号数的处理是不同的...(5) 位段的长度不能大于存储单元的长度,也不能定义位段数组。 (6) 位段可以用整型格式符输出。 (7) 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。
上一篇博客我们主要介绍了布尔代数和C语言当中的几个运算符。...这个函数可以举几个简单的例子来看: ? 那么很显然,对于一个无符号编码的数,由 w 位的二进制序列构成,那么它的最小值,即所有位都为 0 ,用位向量表示即:【000......000】。...对于负整数,原码和补码互相转换的简便方法:从数的右边往左开始数,遇到“0”不理它,直到遇到第一个“1”为止,以后的每一位数取反即是它的原码或补码,符号位不变,还是“1”(补码的补码是原码)。 ...6、有符号和无符号数之间的转换 在 信息的存储和表示 这篇博客中我们讲过计算机在解释一个数据类型的值时主要有四个因素:位排列规则(大端或者小端)、起始位置、数据类型的字节数、数据类型的解释方式。...下一章会介绍C语言中的有符号数和无符号数以及扩展和截断数字。
10进制是很困难的,但是计算机使用的就是二进制。...,则反码和原码相同;一个数若为负值,则符号位为1,其余各位与原码相反。...0代表正数,1代表负数;(即有正有负) 无符号数的最高位就是数的一部分,不是正负的意思(即无符号数只有正数) 例如: 有符号数的原码 0000 0000 0 0000 1000 8 1000 1000...由于微软在VS2013中不建议再使用c的传统库函数scanf,strcpy,sprintf等, 所以直接使用这些库函数会提示C4996错误,在源文件中添加以下指令就可以避免这个错误提示: 法一: #define...优先级编号 运算符 优先级一样时: 1(优先级高) []数组下标、()圆括号、()调用函数、
: 逗号表达式: , 下标引⽤: [] 函数调⽤: () 结构成员访问: . 、-> 上述的操作符,我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单⽬操作符,今天继续介绍⼀部分...转换为二进制的过程为: 三、原码、反码和补码 整数可以分为有符号整数和无符号整数,无符号整数就全部都是正数,而一般的原码、反码和补码一般出现在有符号整数中,在有符号整数中,数值的表⽰⽅法有三种...(和右移操作符(>>),它的操作数只能是整数,只能移位正整数,如>>1,而不能>>-1,这是未定义的部分,不要使用,并且移位的对象是二进制,所以要对其它进制进行移位时,需要将其转化为二进制再进行移位...1位,那么就会变成-20 2.右移操作符 右移操作符有点特殊,有两种,分为两种逻辑右移和算术右移两种,逻辑右移主要用于无符号数的位运算,而算术右移主要用于有符号数的位运算。...(1)逻辑右移移位方法 类似于左移操作符,一般用于无符号数,将一个无符号二进制数向右移动n位,然后将右边抛弃,左边补0,比如将无符号数10右移一位,如图: 我们要对10进行逻辑右移操作
领取专属 10元无门槛券
手把手带您无忧上云