C++ 带符号和无符号char类型赋值超出表示范围的情况

您所在的位置:网站首页 char超出范围怎么计算 C++ 带符号和无符号char类型赋值超出表示范围的情况

C++ 带符号和无符号char类型赋值超出表示范围的情况

2024-07-13 15:58| 来源: 网络整理| 查看: 265

在C++中字符型被分为了三种:char、signed char和unsigned char。需要的注意:

字符的表现形式只有两种:带符号的和无符号的,类型char具体使用哪一种由编译器决定;如果需要使用不大的整数,应该明确指出它的类型是signed char或者unsigned char。

关于带符号类型:

带符号类型在表示范围内正值和负值的量应该平衡,例如,8比特理论上应该可以表示-127至127,大多数现代计算机将实际的表示范围定位-128至127;当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined),程序可能继续工作、可能崩溃,也可能生成垃圾数据。

关于无符号类型:

无符号类型中所有比特都用来存储值,例如,8比特的unsigned char可以表示0至255区间内的值;当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数(即取模后所得的数,并不是取余)。

例如:8比特大小的unsigned char可以表示0至255区间内的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256(总数)取模后所得的余数。因此,把-1赋给8比特大小的unsigned char所得的结果是255,使用2种方法计算:

有整数a和b,a对b进行取模或取余运算1、求整数商:c=a/b取模运算在计算商值向负无穷方向舍弃小数位取余运算在计算商值向0方向舍弃小数位2、计算模或者余数:r=a-(c*b)注:取模运算遵循尽可能让商小,取余运算遵循尽可能让余数的绝对值小。因此,取模和取余的结果不同。

mod为取模,rem为取余,取模和取余所得的结果在a和b(同为整数) 符号相同 的时候是相等的

当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。但是当符号不一致的时候,结果不一样。

具体来说,求模运算结果的符号和b一致,求余运算结果的符号和a一致。

在本例中,将-1和256带入a和b,c=-1/256,向负无穷方向舍弃小数得-1,计算得r=255.

计算机中带符号的整数采用二进制的补码进行存储正数的补码等于其二进制编码负数的补码等于其绝对值的二进制编码,取反,再加1在本例中,-1的绝对值是1,二进制编码为0000 0001,取反加1就是1111 1111unsigned是无符号数,会把1111 1111看成正数,刚好是255的二进制编码。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3