C++ Primer - 有符号数和无符号数

有符号数和无符号数:

有符号数和无符号数:
整数型: 默认的int,short,long都是有符号数
** 前面加 unsigned ,定义无符号数 ** eg : unsigned long;
字符型:
char //char 根据编译器 默认为以下其中一种
signed char //-128 ~ 127 的值
unsigned char /存储值 0~255区间的值

选择有符号和无符号的建议:

1.明确数值不为负,建议使用无符号
2.**long 和 int 尺寸相同,数值超过int 就使用long long **
3.算术表达式中不使用char 或 bool,因为char不确定在所处机器中是有符号数还是无符号数,
使用char运算容易出现问题.如果需要使用char,必须指明是signed char 或者unsigned char
4.执行浮点运算使用double , 对于某些机器来说double 运行的甚至比float运行的快
慎用long double,时间成本太高

⭐类型转换

类型转换:把某对象从一种类型转换为另一种类型
bool and else:
其他转成布尔类型:0 false ,其他 true
布尔类型转其他:false 则结果为0
int and double:
整数转成浮点型:
范围内:小数部分补零
超范围:精度损失
浮点型转整数型:精度损失
signed and unsigned :
有符号转无符号类型:
当无符号数和有符号数都是正数的时候 :相互转换无影响
当无符号数取负数时候,强制转化为有符号数 : (负数 + n*区间)

char short int long int + unsigend int =>unsigend int
unsigend char + int => int; 
int char short int long + float double =>double 

无符号的自动转化:当无符号数被赋予负数 自动转化为 有符号数

unsigned char a = -1;
a=? a%256 = ?
eg: -1 赋给 8bit大小的unsigned char 结果是 255
∵ 无符号数中没有负数
过程:
a=-1 + nT > 0
T = 256,当n = 1
a = 255

a%256 => 255 / 256 = 0 …255
∴ a%256 = 255

取余运算

对于整型数a,b来说,取模运算或者求余运算的方法都是:
1.求 整数商: c = a/b;
2.计算模或者余数: r = a - c*b.
求模运算和求余运算在第一步不同:
取余运算在取c的值时,向0 方向舍入(fix()函数);取模运算在计算c的值时,**向负无穷方向舍入(floor()函数)。

各个环境下%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

tips : 取余操作中 余数符号与a的符号一致
a 为有符号数时:
200 / 7 = 28 … 4 7*28=196 -> -200 需要+ 4 ∴ 200 % 7 = 4
200 / -7 = -28 … 4 -7*28=196 -> 200 需要+ 4 ∴ 200 % 7 = 4
-200 / 7 = -28 … -4 7*-28= -196 -> -200 需要+ (-4) ∴ 200 % 7 = -4
-200 / -7 = 28 … **-4 ** - 7*-28=-196 -> -200 需要+ (-4) ∴ 200 % 7 = **-4

7/200 = 0 … 7
7/-200 = 0 … 7
-7/200 = 0 … -7
-7/-200 = 0 …-7

当a为无符号数时:
unsigned char temp = -7;
temp / 200 => (-7+256) / 200 = 1 … 49
temp / -200 =>(-7+256) / -200 = -1 … 49

当a和b都为无符号数时候:
unsigned char a = -7,b=-200;
a % b =>(-7+256) / (-200+256) =>249 / 56 = 4… 25
∴ a%b = 25**
结论: 无符号数 无 负数,见到负数就加上当前类型的范围,把他转化为正数
C++中取模就是取余数

扫描二维码关注公众号,回复: 9472879 查看本文章
#include<stdio.h>
int main(){
	int temp = 200%7;
	printf("%d\n",temp);  //4
	temp = 200%-7;
	printf("%d\n",temp);  //4
	temp = -200%7;
	printf("%d\n",temp);  //-4
	temp = -200%-7;
	printf("%d\n",temp);  //-4
} 
#include<stdio.h>
int main(){
	int temp = 7%200;   //7
	int temp2 = 7%-200; //7
	int temp3 = -7%200; //-7
	int temp4 = -7%-200;//-7
	printf("%d\n%d\n%d\n%d\n",temp,temp2,temp3,temp4);  
} 
#include<iostream>
using namespace std;
int main(){
	unsigned char temp = -7;
	cout << temp%200 <<endl;  //49
	cout << temp%-200 <<endl;  //49
} 
#include<iostream>
using namespace std;
int main(){
	unsigned char a = -7,b = -200;
	cout << a%b <<endl;  //25
} 

⭐从二进制角度:看无符号数负数的自动转换

#include<iostream>
using namespace std;
int main() {
	unsigned char a_u = -1;
	/* -1 是有符号数  当是负数时,求反+1
	       1 000 0001 =>-1  原码
	       1 111 1110 =>-126 反码
		   1 111 1111 =>-127 补码
		现在 -1的补码 以无符号a_u数角度看
		   1111 1111 => 255 
	*/
	cout << a_u << endl; //无结果
	printf("%d\n", a_u); //255
	system("pause");
}

发布了76 篇原创文章 · 获赞 0 · 访问量 1778

猜你喜欢

转载自blog.csdn.net/AKUANer/article/details/104344500