java正数对负数取模,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*区间)

⭐当一个算术表达式里面,既有无符号数,又有int型,那么int型会自动转化为无符号数

⭐当无符号数减去一个值时候,必须保证结果不能是负值

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++中取模就是取余数

#include

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

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

using namespace std;

int main(){

unsigned char temp = -7;

cout << temp%200 <

cout << temp%-200 <

}

#include

using namespace std;

int main(){

unsigned char a = -7,b = -200;

cout << a%b <

}

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

#include

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");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值