C/C++走过的坑(基础问题篇)!

本文探讨了C/C++编程中的一些常见问题,包括有符号与无符号整型比较导致的错误,原码、反码、补码的概念,位域变量的符号问题,整除精度丢失,浮点数比较的精度误差,最小整数取反溢出,临时变量溢出,continue与return的区别,指针常量与常量指针的使用,字符数组与指针的不等价性,以及cin与getline的混用问题。通过对这些问题的分析,帮助开发者避免这些陷阱。
摘要由CSDN通过智能技术生成

1.有符号int与无符号int比较

#define TOTOL_ELEMENTS (sizeof(a) / sizeof(a[0]) );

int main()

{

    int a[] = {23,24,34};

    int d = -1;

    if(d<=TOTOL_ELEMENTS)

        printf("TRUE\n");

    else

        printf("FLASE\n");

    return 0;

}

//结果是FLASE而不是TRUE

结果分析:sizeof() 返回的是无符号整型,因此上述代码中TOTOL_ELEMENTS 的值是unsigned int类型。与 if  语句中signed int 型的 d 比较,signed int 型会被转化成unsigned int  型变量。

-1会转化成一个非常巨大的数---65535

*************************************************************

原码、反码、补码:

原码:二进制定点表示法,即最高位是符号位。0为正,1为负。

反码:正数的反码与原码相同;负数的反码是对其原码逐位去反,符号位除外。

补码:正数的补码与原码相同;负数的补码是在其反码末位上加1。

在计算机中,数值一律用补码存储,因为其能将符号位与数值统一处理。

********************************************************************

以int型的-1为例:

-1是负数,原码为  10000000 00000001   (int为2字节)

反码为       11111111 11111110 

补码为       11111111 11111111   

那么有符号怎么转化成无符号的呢?直接取绝对值的补码就行了。算术解决:|a|*2-|a| = 无符号的a

int a = -1;

(unsigned int)a= ?

(1)先取-1 的绝对值1的原码  00000000 00000001

(2)将其转化为反码              01111111 11111110  

(3)对所求的数+1得到补码。补码就是无符号char的a值,转换为十进制数为65535

所以(unsigned int)a=65535;

另外,注意:printf函数输出的是无符号的值!!

2.位域变量 的符号问题

#include <stdio.h>

struct data

{<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值