1.有记号int与无记号int相比taylor swift ai换脸
#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 的 值无法输入
处理:将扫视那句激活
指示:输入/输出 语句用一种就好了taylor swift ai换脸,不要混用