新闻
kaiyun网站因为其能将标识位与数值协调处理-开云(中国)Kaiyun·官方网站登录入口
发布日期:2025-04-27 16:45    点击次数:90
 

1.有标识int与无标识int比拟kaiyun网站

#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

{

int flag: 1;//;或者,皆是允许的

int other: 31;

};

int main()

{

struct data test;

test.flag = 1;

if (test.flag == 1)

printf("test.flag =1,it is true\n");

else

printf("test.flag !=1,it is flase\n");

return 0;

}

输出:test.flag !=1,it is flase

分析:flat 是 int型的位域变量,用一个bit来暗示int时,这一位是用来暗示标识位的,带标识的一个bit的位域变量的取值鸿沟是0或者-1(无标识的一个bit的位域变量的取值鸿沟是0或者1)!!

当1赋值给test.flag时辰,test.flag溢出,变为 -1......

将结构体改为一下代码即可:

struct data

{

unsigned int flag: 1;//;或者,皆是允许的

int other: 31;

};

3.整除的精度问题

int main()

{

float result;

result = 1/6;

printf("result= %f\n",result);

return 0;

}

输出: 0

分析:1和6皆是整型变量,两个整型变量效果已经是整型,不会保留整数部分。(毕竟是先运算再等号的)

修改:把 1 或者 6 的至少一个改为浮点类型暗示即可!

在C道话中存在隐式类型转机:

(1)赋值时一律是右边值转动为左边,关联词右边是抒发式时,会先进走运算,然后才对运算的效果进行数据类型转机。

(2)当不同类型的变量进行计较时,死守由初级向高等转机原则。如:char-->int ,short-->int , float -->double。。。。

4.浮点数的比拟精度问题

int main()

{

float f = 1.0/3.0;

float expect_f = 0.333333333;

double d = 1.0/3.0;

double expect_d = 0.333333333;

printf("f = %f, expect_f = %f, d = %lf, expect_d = %lf\n",f,expect_f,d,expect_d );

if (f==expect_f && d == expect_d)

printf("equal!!\n");

else

printf("not equal!!!\n");

}

输出:

f = 0.333333, expect_f = 0.333333, d = 0.333333, expect_d = 0.333333

not equal!!!

分析:浮点数暗示精度的位数有限,不行准确暗示一个少许(IEEE754纪律:单精度的float数据类型7位灵验数字,double16位灵验数字)

=====》浮点数比拟时,一般比拟他们之间的差值在一定鸿沟内

将 if 的条目部分改为以下:

1

2

if (fabs(f-expect_f)<0.000001 && fabs(d == expect_d)<0.000001)

printf("equal!!\n");

5.最小整数取相悖数溢出

int main()

{

int a = 0xffffffff;

if(a<0)

a = -a;

printf("a =%d \n",a);

return 0;

}

效果:a = 1

分析:有标识的数据类型,有正负之分,如int,double,float...溢出后去反,取得a = 1

责罚:对int数据类型进行去反处理时辰,需要非凡处理这种情况,添加以下代码:

else if (a == 0xffffffff)

printf("a = %d\n",a );

6.临时变量溢出问题

long multiply(int m,int n)

{

long score;

score = m*n;

return score

}

分析:m,n的相乘效果会先存储在一个临时的int变量中,然后再赋值给long变量score,这个临时变量容易溢出。是以在抒发式运算前需要对m和n进行数据转机。

(64位平台,int 4bit, long 8bit--------------也不摈斥一些装了一些32位的软件,比如Dev-C++

32位平台,int 4bit,long 4bit)

岂论如何:一定要提防数据溢出问题!!

7.分离continue与return

return 用来复返某个值并退出才智;

continue 用于轮回中,遏抑本次轮回

8.指针常量与常量指针

指针常量:指针在常量前边。int *const 指针名 -------------指针自己是常量,它指向的地址不不错改革,关联词地址内的数据不错凭据指针的解援用改革!!

常量指针:常量在指针前边, const int *指针名 -----------指向常量的指针,顾名想义,指针指向常量,不不错指向变量!是以不行通过改革指向地址的现实!!,关联词指针自身不是常量,自身的值不错改革,即指向哪个常量是不错改革的!

int main()

{

int a =2;

int b =4;

int *const pa = &a; //指针常量,只可改革地址内的现实

const int *pb = &b; //常量指针,只可改革地址

std::cout<< *pb <<endl;

std::cout<< *pa <<endl;

pb=pa;

std::cout<< *pb <<endl;

*pa = 343;

std::cout<< *pa <<endl;

输出:4 2 2 343

正确!!

9.字符数组和指针不老是绝顶的

在不同文献用extern援用的时辰,字符数组和指针不是绝顶的!!

不不错在a.cpp中:

char a[]="Hello world!";

然后在b.cpp中:

extern char *a; //WRORG

10.cin>>和 getline 混用导致的奇怪问题

cin 是c++活动输出流istream类型的对象,代表活动输出诞生,畸形于c中的stdin。才智中包含iostream头文献既不错使用 cin对象。istream类重载了抽取操作符">>",好像读取C++中的多样基础数据类型,抽取符“>>”凭据后头变量的类型读取数据,从非空缺标识初始没遭受Enter,Space,Tab遏抑

std::getline函数从istream中读取一排数据 遭受“\n”遏抑

#include <iostream>

using namespace std;

int main()

{

int a;

string b;

cout<< "Please input a:"<<endl;

std::cin>> a;

// cin.ignore(); //默许cin::ignore(1,EOF)

cout<< "Please input b:"<<endl;

std::getline(cin,b);

cout<< "a:"<<a <<endl;

cout<< "b:"<<b<<endl;

return 0;

}

输出:b 的 值无法输入

责罚:将防卫那句激活

教导:输入/输出 语句用一种就好了kaiyun网站,不要混用