总结归纳计算机编程中的各种数据类型,其表示形式和计算方法

一、整型 int/unsigned int

1.表示形式:

  • 有符号整型数:int
  • 无符号整型数:unsigned int

2.计算方法:

  • 类型转换
    同类型之间(int 与 int、unsigned int 与unsigned int)的转换,转换后类型不变,int 和 unsigned int 之间,转换后为unsigned int

  • 数值溢出
    对于无符号数:
    若数据(N位)溢出,即超出有效范围(2N-1),则结果为对2N-1取余;
    对于有符号数:
    溢出的数据正常显示,并不进行求余运算。

  • 移位运算
    位移位对于二进制数进行操作。移位时,移出的数据全部舍弃,空位补入的数据取决与左移还是右移。且进行移位运算时,符号位不变,只有数值位参与移位。
    左移:
    最高位移出舍弃,低位补0;
    右移:
    最低位移出舍弃,若为正数,高位补0;若为负数,高位补1。

二、浮点型 float/double

1.表示形式:

  • 单精度型float
  • 双精度型double

2.表示方法:
(1)浮点数的表达方式:
N=±S×R±e
S为尾数,代表N的有效数字;
R为基值,通常取2、8、16;
e为阶码,代表N的小数点的实际位置,相当于数学中的指数;
浮点数就是利用阶码e的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数

(2)浮点数的格式化:
当浮点数的基数R为2时,即采用二进制数时,格式化尾数的定义为1/2≤|S|<1,若S=SfS₁S₂S₃S₄S₅…Sn(Sf为符号位),则满足S₁=1的数为格式化数。
例:0.001001×25进行格式化后,表示为0.100100×23

(3)浮点数的表示范围:
在这里插入图片描述
0、处于最小负数到最大负数(负数区)之间以及处于最小整数到最大整数(正数区)之间的数为浮点数所能正确表达的数,处于下溢区的数,由于其绝对值小于机器可以表示的数值,在计算机中通常作0处理,称为机器0;处于上溢区的数,由于其绝对值大于机器所能表示的数值,计算机将进行溢出处理。

(4)IEEE754浮点数标准

符号位S指数E尾数M

在次标准中,32位单精度浮点数表示格式如下:
IEEE754标准中32位单精度浮点数表示格式
各部分规定如下:
S:符号位,0为正,1为负
E:阶码部分,包括1位阶符和7位数值。采用移127码,移码值为127
M:尾数,共23位,用格式化表示
例:-60.25 其符号位S=1,数值绝对值用二进制表示为111100.01=1.1110001×25,阶码E=5+127=132,可得1000 0100;M=1110001,补全23位后,可得111 0001 0000 0000 0000 0000;最终得到-60.25的浮点数为1 1000 0100 111 0001 0000 0000 0000 0000

64位双精度浮点数double的表示方法与32位单精度浮点数float的表示方法类似,阶码变为11位,且移码值为1023。

3.计算:

  • 类型转换
    当操作数有浮点型数据时,均会转换成double类型进行运算

  • 加减运算
    x=Mx × 2Ex ,y=My× 2Ey
    (1)对阶:ΔE=Ex - Ey
    如果ΔE=0,说明两数阶码相等,无需对阶;
    如果ΔE>0,表示Ex>Ey,Ey要向Ex靠拢,其尾数My要作相应右移;
    如果ΔE<0,表示Ey>Ex,Ex要向Ey靠拢,其尾数Mx要做相应右移;
    (2)尾数相加
    完成对阶后,两数的小数点已经对齐,可以进行尾数的加减运算;
    (3)结果格式化
    如果尾数相加结果的两个符号位数据不相等,表明运算结果的尾数绝对值大于1,应向右规格化,因此尾数右移1位,阶码加1
    如果尾数相加结果的符号位与数据最高位相等,表示数据没有规格化,尾数应向左规格化,即尾数左移n位,阶码相应减n
    (4)舍入处理
    为了减少对阶和向右规格化过程中造成的误差,要进行舍入处理,常用的两种舍入方法为:
    ①0舍1入
    若尾数右移时被丢掉的数据的最高位为0,则舍去;若为1,就在尾数的最低位加1;
    ②横置1
    尾数右移时,只要发生低位数据的丢失,尾数的最低位就设为1;
    (5)溢出处理
    浮点数在规格化的过程中,阶码会做相应的调整,可能会产生阶码溢出的现象;
    若阶码减n后溢出,发生阶码的下溢,表示运算结果的精度超出了该浮点数可以表示的范围,运算结果趋近0,机器一般认为运算结果为0;
    若阶码加1后溢出,发生阶码的上溢,表示运算结果超出了浮点数可表示的范围,一般可认为是+∞或-∞,发生溢出,机器的溢出标志会被置1;

  • 乘除运算
    运算步骤同加减运算:
    (1)对阶
    (2)尾数乘除
    (3)结果格式化
    (4)舍入处理
    (5)溢出处理

三、字符型 char

1.表示形式: char
2.计算方法:
char与unsigned char在参与运算时,均转换成整型int,再进行运算。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建和使用ROS话题的步骤如下: 1. 创建一个ROS包,如果已经创建了ROS包则跳过此步骤。 ``` $ cd catkin_ws/src $ catkin_create_pkg <package_name> [depend1] [depend2] [depend3] ``` 2. 在包创建一个msg文件夹,并创建一个.msg文件。 ``` $ cd <package_name> $ mkdir msg $ touch msg/<message_name>.msg ``` 3. 在.msg文件定义消息类型和字段。 ``` float64 data ``` 4. 在CMakeLists.txt文件添加以下行: ``` add_message_files( FILES <message_name>.msg ) generate_messages( DEPENDENCIES std_msgs ) ``` 5. 在package.xml文件添加以下行: ``` <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend> ``` 6. 在源代码文件包含消息文件头文件。 ``` #include "<package_name>/<message_name>.h" ``` 7. 创建一个发布器(Publisher)并发布消息。 ``` ros::Publisher pub = nh.advertise<package_name::message_name>("topic_name", queue_size); package_name::message_name msg; msg.data = 0.0; pub.publish(msg); ``` 8. 创建一个订阅器(Subscriber)并接收消息。 ``` void callback(const package_name::message_name::ConstPtr& msg) { ROS_INFO("Received: [%f]", msg->data); } ros::Subscriber sub = nh.subscribe("topic_name", queue_size, callback); ``` 9. 运行ROS节点。 ``` $ roscore $ rosrun <package_name> <node_name> ``` 以上是创建和使用ROS话题的基本步骤。在实际使用,还需要注意以下几点: - 发布器和订阅器的队列大小queue_size应该根据实际情况设置,以避免消息丢失或延迟。 - 发布器和订阅器的话题名称应该保持一致,否则无法正确通信。 - 在使用自定义消息类型时,需要先编译生成消息头文件,才能在源代码包含并使用该消息类型。 - 在运行ROS节点之前,需要先启动roscore。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值