深入探究C/C++基本数据类型

本文探讨了C++中不同类型的数值运算特性,包括有符号数和无符号数之间的运算规则,以及浮点数在内存中的表示方式。通过具体的代码示例解释了这些特性的实际应用,并提供了将浮点数转换为整型和求double类型绝对值的方法。

  1、有符号数与无符号数之间在运算之前,会先把有符号数都“转换”成/当成无符号数。例子:

int main()
{
    int a = -1;
    unsigned int b = 2;
    cout << (a > b) << endl;    // 1
    cout << (a > 2) << endl;    // 0。注意常数被当成有符号数

    int c = -3;
    unsigned int d = 2;
    cout << c + d << endl;    // 4294967295
    cout << a + b << endl;    // 1。a还是有被转换成无符号数!
}

  另一个例子:

#include <stdio.h>

#define ELEMENT_COUNT (sizeof(array) / sizeof(array[0]))
int array[] = {2, 3, 5, 7, 11, 13};

int main()
{
    int d;

    for (d = -1; d <= (ELEMENT_COUNT - 2); d++)    // d被转换为很大的无符号数,导致比较条件不成立,循环不会执行
        printf("%d\t", array[d + 1]);
    for (d = 0; d <= (ELEMENT_COUNT - 1); d++)    // 输出2  3  5  7  11  13
        printf("%d\t", array[d]);
    return 0;
}

  对于有符号数,正数“取反加1”得到对应的负数。如:0x00000071(即113) -> 取反得到0xffffff8e -> 加1得到0xffffff8f(即-113)。

 

   2、浮点数在内存中的表示(IEEE标准)

 符号位bit数指数位bit数/指数偏移量小数部分bit数
单精度浮点数18/12723
双精度浮点数111/102352

  以下是几个例子:

  1)-12.5f的“转换”过程:-12.5f -> -(1100.1)2 -> “标准”形式-(1.1001 * 23)2“标准”形式中有三部分(符号位、指数位和小数部分)需要保存

  (1)符号位为'-',因此第一个bit为(1)2

  (2)指数位为'3',加上偏移量127(8个bit的指数位只能表示0~255,因此可能为负的指数需要加上偏移量来保存)等于130,即(10000010)2

  (3)小数部分为'1001',为补全23个bit,填充19个0,因此小数部分是(10010000 00000000 0000000)2

  因此最终的二进制数为(11000001 01001000 00000000 00000000)2,即0xC1480000。

  2)“转换”成整型:

float f = 12.5;    // 0x41480000,即(1095237632)10

printf("%d\n", (int)f);    // 12
printf("%d\n", *(int *)&f);    // 1095237632。与(int &)f等价

  3)求double的绝对值:

double ab(double y)
{
    double x = y;
    *(((int *) &x) + 1) &= 0x7fffffff;    // 只改变它的符号位。这里是小端模式(低字节保存在低地址)

    return x;
}

 

 

 

 

 

不断学习中。。。

转载于:https://www.cnblogs.com/hanerfan/p/3390456.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值