【C语言】数据以及位运算

news2024/11/28 14:12:03

位和位运算

  • C语言中数据的表示方法
    • 各种数据类型可表示的数值范围
    • 位和CHAR_BIT
    • sizeof运算符
    • 整型的内部表示
      • 无符号整数的内部表示
      • 有符号整数的内部表示
  • 位运算
    • 位运算符
      • 位与运算
      • 位或运算
      • 位异或运算
      • 位取反运算
      • 位左移运算符
      • 位右移运算符
      • 逻辑位移与算术位移

C语言中数据的表示方法

各种数据类型可表示的数值范围

C语言编译器在<limits.h>头文件中以宏定义的形式定义了字符型以及其他整型所能表示的数值的最大值和最小值。
下面来看看在VC++环境下的各数据类型所能表示的数值范围。

  #include <stdio.h>
#include <limits.h>
int main(void)
{
	puts("该环境下各字符型、整型数值的范围:");
	printf("char              :%d~%d\n",CHAR_MIN,CHAR_MAX);
	printf("signed char       :%d~%d\n",SCHAR_MIN,SCHAR_MAX);
	printf("unsigned char     :%d~%d\n",0,UCHAR_MAX);
	printf("short             :%d~%d\n",SHRT_MIN,SHRT_MAX);
	printf("int               :%d~%d\n",INT_MIN,INT_MAX);
	printf("long              :%d~%d\n",LONG_MIN,LONG_MAX);
	printf("unsigned short    :%d~%d\n",0,USHRT_MAX);
	printf("unsigned int      :%u~%u\n",0,UINT_MAX);
	printf("unsigned long     :%lu~%lu\n",0,ULONG_MAX);

	return 0;
}


在这里插入图片描述

位和CHAR_BIT

计算机中的所有数据都是用0和1(即“位”)的组合来表示的。
C语言中“位”(bit)的定义如下:

  • “位”是具有大量内存空间的运行环境的数据存储单元,可保存具有两种取值的对象。
  • “位”可取两种值,其中一种是0。将位设为0以外的值,称为“设置位”。

根据编译器的不同,char型在内存上占据的位数也不同。该位数作为对象式宏CHAR_BIT定义在<limits.h>中。
char型的位数因编译器而定,至少为8
能够用字符型表示的数值范围是依附于CHAR_BIT的。

#include <stdio.h>
#include <limits.h>
int main(void)
{

	printf("char 型在内存上占据的位数:%d\n",CHAR_BIT);

	return 0;
}

在这里插入图片描述
char型的内部:
图片来源于 《明解C语言》

sizeof运算符

C语言中将表示字符的char型的长度定义为1。(char的长度可以通过计算机硬件的位数来确定。在32位系统中,char占用1个字节(8位);在64位系统中,char也仍然占用1个字节(8位)。这意味着char的长度不会随着计算机系统的升级而改变。)
通过使用sizeof运算符(sizeof operator),可以判断出包括chai型在内的所有数据类型的长度。该运算符以字节(bite)为单位。

下面我们来使用sizeof运算符,显示字符型和整型的长度。

#include <stdio.h>
int main(void)
{
	printf("sizeof(char)=%d\n",sizeof(char));
	printf("sizeof(short)=%d\n",sizeof(short));
	printf("sizeof(int)=%d\n",sizeof(int));
	printf("sizeof(long)=%d\n",sizeof(long));
	printf("sizeof(unsigned char)=%u\n",(unsigned)sizeof(char));
	printf("sizeof(unsigned short)=%u\n",(unsigned)sizeof(short));
	printf("sizeof(unsigned int)=%u\n",(unsigned)sizeof(int));
	printf("sizeof(unsigned long)=%u\n",(unsigned)sizeof(long));

	return 0;
}

在这里插入图片描述

  • 程序的运行结果因编译器和编译环境的不同而不同。但sizeof(char)必为1。`
  • 各种数据类型的有符号型无符号型的长度相同。例如,sizeof(short)和sizeof(unsigned short)相等,sizeof(long)和sizeof(unsigned long)相等。
  • short 、int、long具有如下关系:
    sizeof(short)≤sizeof(int)≤sizeof(long)
    即右侧的数据类型和左侧的数据类型相等,或者大于左侧的数据类型。

整型的内部表示

整型内部的位表示使用的是纯二进制计数法(pure binary numeration system)。但对于构成整型的位序列的解释,无符号类型有符号类型是完全不同的。

无符号整数的内部表示

无符号整数的数值在计算机内部是以二进制数来表示的,该二进制数与各二进制位一一对应。例如十进制数25用二进制数表示如下:
图片来源于《明解C语言》

25用二进制数表示是11001,高位补0后表示为0000000000011001。
以16位为例,无符号整数的最小值为0,即0000 0000 0000 0000,最大值为65535,即1111 1111 1111 1111。
在这里插入图片描述
图片来源于《明解C语言》

有符号整数的内部表示

当存储有符号数时,最高位为符号位(1表示负数,0表示非负数),其余位是数据位
计算机中有符号整数的存储是以补码形式存储的。
一个整数有以下三种编码。
原码
十进制整数数码化为原码的方法是首先把十进制整数转换为二进制,然后在高位用0补足15位,最后添上符号位。
反码
对整数而言,原码即为反码,对负数而言,反码是将原码中除符号位之外的其余位依次取反。
补码
对整数而言,原码即为补码。对负数而言,补码是在反码的基础上加1。在求补码的过程中,符号位不发生变化,当数据的最高位有进位时,舍弃进位。
补码的运算法则如下:

补码的运算法则

位运算

位运算符

C语言提供了六种运算符:
&位与运算符
|位或运算符
^位异或运算符
~位取反运算符(单目运算符)
<<位左移运算符
>>位右移运算符
注意,位运算的对象只能是整型和字符型,不能是浮点型数据。运算结果是整形数据。

位与运算

&运算的含义是对参与运算的两个运算对象的机器码按二进制方式对相应位进行位与运算,当两个相应位都为1时,运算结果的相应位也为1;否则,运算结果的相应位为0。
在这里插入图片描述

位或运算

|运算的含义是对参与运算的两个运算对象的机器码按二进制方式对相应位进行位或运算,当两个相应位都为0时,运算结果的相应位也为0,否则运算结果的相应位为1。
在这里插入图片描述

位异或运算

^运算的含义是对参与运算的两个运算对象的机器码按二进制方式对相应位进行位异或运算,当两个相应位相同时,运算结果的相应位为0,否则运算结果的相应位为1。
在这里插入图片描述

位取反运算

运算的含义是对参与运算的运算对象的机器码按二进制方式对相应位进行位取反运算,1变0,0变1。

在这里插入图片描述
注: & |运算符的功能和&& ||!运算符功能相似,但要注意它们的区别。

&& ||!会根据非零为真,零为假的运算规则对操作数进行逻辑运算。

& |会根据1为真,0为假的运算规则对操作数的二进制位进行逻辑运算。
例如:
表达式 3 & -1的值计算如下:
在这里插入图片描述
而表达式 3 && -1的值为1.

位左移运算符

<<运算的含义是对参与运算的运算对象的机器码按规定的移位数进行左移。<<运算符构成的表达式一般格式为a<<n,其中a是需要移位的数据,n是移位的位数。在移位的过程中,高位移除的位舍弃,低位左移后补0。
例如:
表达式a<<1的运算如下:(a=3)
在这里插入图片描述

这里需要注意的是,a<<1后,a的值不变。
以上述为例,通过左移a<<1的值为6,是原来的2倍。其实不难理解,以十进指数为例,假如将198进行左移,低位补0后,变成了1980,是原来的10倍。而在二进制中,若向左移动n位,那么a<<n就会变成原来的2的n次方。

位右移运算符

>>运算的含义是对参与运算的运算对象的机器码按规定的移位数进行右移。>>运算符构成的表达式一般格式为a>>n,其中a是需要移位的数据,n是移位的位数。
例如:
表达式a>>1(a=3)的运算如下:
在这里插入图片描述
同样的,a>>1后,a的值不变。
通过右移,a>>1的值变为原来的二分之一。在二进制中,若向右移动n位,则会变为2的n次方分之一。(不一定是恰好是整数倍,可能会有余数,但是商的结果是。)

逻辑位移与算术位移

对于右位移运算,可以分为两种,逻辑位移和算术位移。
逻辑位移

逻辑移位不考虑符号位,所有二进制位都进行位移。(包含符号位在内的所有位都进行位移)
这样对于负数而言,进行右位移运算后,会变成非负数。
例b>>4(b=-16)
在这里插入图片描述
位移为-16,进行位移运算,b>>4的值为2的12次-1。

算术位移

算术位移会保留最高位的符号位,只对除了符号位之外的其他位进行位移。
对于位移之后的空位用符号位的值进行填充。位移前后的符号不变,即负数还是负数,正数还是非负数。
以上述b>>4(b=16)为例

在这里插入图片描述
b>>4的值为-1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIA-RS实验-路由配置-OSPF 单区域配置

OSPF&#xff08;Open Shortest Path First&#xff09;是一种基于链路状态的路由协议&#xff0c;常用于大型企业网络中。在一个单区域的OSPF网络中&#xff0c;所有的路由器都属于同一个区域&#xff0c;这种配置方式相对简单直观。本文将介绍OSPF单区域的配置方法。 这篇文章…

Vultr 简介和域名购买

1. 网络地址 Vultr: https://my.vultr.com/ Namecheap: Namecheap.com • Login 2. Vultr 简介&#xff1a; Vultr是一家知名的云计算服务提供商&#xff0c;成立于2014年&#xff0c;总部位于美国新泽西州。Vultr提供高性能的云服务器、存储、网络和应用服务&#xff0c;以…

如何把低像素图片转成高清,分享四个方法给大家!

当图片的像素较低时&#xff0c;通常会导致图片模糊不清。然而&#xff0c;我们可以采取一些方法来将低像素图片转变为高清。下面我将介绍几种简单易用的方法&#xff0c;帮助您快速提高照片的分辨率&#xff0c;还原照片的清晰度&#xff01; 方法一&#xff1a;记灵在线工具…

【attention|Tensorformer】从attention走向Transformer

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 概括 说明&#xff1a; 后续增补 1. 正文 1.0 通俗理解 人类视觉的注意力&#xff0c;简单说就第一眼会注意在一幅图像的重要位置上。 而在程序中&am…

vim实用功能汇总

文章目录 1. 读代码1.1 vim中文件跳转1.2 语法高亮模式1.3 Visual 模式 2. 配置vim成为python的IDE 1. 读代码 1.1 vim中文件跳转 vim中文件跳转 这个其实不是靠什么插件完成的&#xff0c;而是vim编辑器自带的功能把光标放在要跳转的文件上&#xff0c;按下gf&#xff0c;即…

YOLOv5改进系列(7)——添加SimAM注意力机制

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

delete 清空表之后,磁盘空间未发生变化?

上篇文章结尾和小伙伴们留了一个小问题&#xff0c;就是关于 optimize table 命令&#xff0c;今天我想花点时间再来和小伙伴们聊一聊这个话题。 1. 删除空洞 1.1 案例展示 首先我们先来看这样一个例子。 我现在有一个名为 sakila 的数据库&#xff0c;该库中有一个 film 表…

C++轻量级跨平台桌面GUI库FLTK的简单使用

C的跨平台桌面GUI库有很多&#xff0c;大体上分成两种流派&#xff1a;retained mode和retained mode。 其中前者是主流的桌面GUI机制框架&#xff0c;包括&#xff1a;Qt、wxwidgets、gtk、juce等后者是一些游戏引擎编辑器常用的GUI机制框架&#xff0c;包括&#xff1a;imgu…

C#常见技能_数组

前几天一个学员在学习C#与数组交互时,也不知道数组可以用来做什么 。下面我们就详细讲讲C# 和数组交互的相关知识。 在C#编程中&#xff0c;数组是一种非常重要的数据结构&#xff0c;它可以存储多个相同类型的数据&#xff0c;并且使用索引来访问这些数据。在实际应用中&…

5.2.7 因特网控制报文协议ICMP

5.2.7 因特网控制报文协议ICMP 我们知道因特网的技术核心是IP数据报&#xff0c;IP数据报的最大特点是无连接不可靠&#xff0c;但实际中因特网中也会存在通信线路或者是处理器的故障、路由器拥塞等等使得无法接收或者处理数据报&#xff0c;路由表也误导导致出现路由环路等原…

微软MFC技术运行机制

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下微软MFC技术运行机制。 很多初学者误以为VC开发必须使用MFC&#xff0c;其实不一定的。MFC的使用只能是提高程序在某些情况下的开发效率&#xff0c;而不能替代整个Win32程序设计。我认为我们有…

python grpc使用示例

1. grpc简介 1.1 概述 gRPC是搭建分布式应用接口和客户端的框架。在 gRPC 中&#xff0c;客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法&#xff0c;就像它是本地对象一样&#xff0c;可以更容易创建分布式应用程序和服务。与许多 RPC 系统一样&#xff0c;gR…

AI绘画MidJourney 酷炫艺术风格效果,总有一款你喜欢

文 / 高扬 今天六一儿童节&#xff0c;祝各位大朋友节日快乐。 这次以儿童为主题&#xff0c;看看MidJourney的绘画风格&#xff0c;在这里&#xff0c;我使用的默认V5.1版本。 图画场景是一个男孩和一个女孩在田野玩耍&#xff0c;对应的英文是&#xff1a;A boy and a girl a…

使用PyQT实现模拟表盘时钟的显示效果

代码 class clockThread(QThread):update_ui_signal pyqtSignal(str)def __init__(self, window):super(clockThread, self).__init__()# 信号绑定槽函数self.update_ui_signal.connect(self.draw_time)self.hour 0self.minute 0self.second 0self.window windowself.win…

数据结构与算法·第6章【树】

基本操作 树的相关定义 树的深度&#xff08;高度&#xff09;&#xff1a;树中叶子结点所在的最大层次 森林&#xff1a; m m m棵互不相交的树的集合 二叉树 二叉树或为空树&#xff0c;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。 性质 二…

JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解析预览图像

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 两年前博主写了如何利用JavaCV解析各种h264裸流,《JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并解析预览图像》,但是随着时间变化,各…

企业邮箱如何设置邮件审核

有的时候对外给客户或合作伙伴等发送邮件需要领导审核后再发&#xff0c;以前都是先发给领导&#xff0c;领导审核以后再重新发给客户&#xff0c; 这样的流程太过繁琐。 新的邮件审核功能既能满足审核需求&#xff0c;又避免了重复发信&#xff0c;可以极大提高工作效率。 设…

使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub

Vue3TSVite开发组件库并发布到npm 网站在线预览&#xff1a; Vue Amazing UI | Amazing UI Components LibraryAmazing UI 组件库https://themusecatcher.github.io/vue-amazing-ui/参考文档&#xff1a; VitePress 目录 一、安装依赖及配置 1、安装 vitepress 2、在 p…

想要精通算法和SQL的成长之路 - 反转链表

想要精通算法和SQL的成长之路 - 反转链表 前言一. 反转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 反转链表 原题链接 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路如下&#xff1a; 我们可以通过一次遍历&#xff…

该怎么用设计测试用例测网上银行转账?

目录 前言 1、网上银行转账是怎么测的&#xff0c;设计一下测试用例。 回答思路&#xff1a; 2、测试工作的流程?缺陷状态有什么?设计测试用例有几种方法&#xff1f; 修改完以后&#xff0c;有两种处理情况&#xff1a; 3、在项目中找到的经典BUG是什么&#xff1f; 4、定期…