c++需要注意unsigned与signed区别
2017-11-30 16:56
417 查看
注意到了一个原来并没有重视的问题。
首先,让我们来看一个简单的c++程序。
#include <iostream>
using namespace std;
int main()
{
unsigned short a;
short int b = -1;
a = b;
cout << a << endl;
return 0;
}
看到这个程序时,我很轻松的下了结论:运行结果为-1;
当然……真实运行结果是这样的
那么问题出在哪里呢?
毫无疑问,就在我们标题所说。
第一点,我们都清楚,修饰符signed代表有符号,也就是说,存储单元的最高位用来表示数值的符号。而unsigned当然与之对应的全部二进制位都用来表示数值本身。
第二点,c++程序中,正数以原码存储,负数以补码存储。(或者说正数的补码与原码相同,即它所代表的数的真值)
然后事情就很清楚了。
b值为-1,也就是原码为1000000000000001,对应补码为1111111111111111.
而当其值赋给a时,unsigned修饰符生效,原本代表符号的“1”现在真的代表了1,并且不再代表负数。
所以,本来说好的补码现在就是原码了。
那也就是说,现在的a值对应的数值原码为1111111111111111.也就是pow(2,15)-1,即65535.
所以,如果将unsigned改为signed,那一切恢复正常,最终结果重新变为-1.
另外:
unsigned 无符号数,作用为存储的数据范围大
首先,让我们来看一个简单的c++程序。
#include <iostream>
using namespace std;
int main()
{
unsigned short a;
short int b = -1;
a = b;
cout << a << endl;
return 0;
}
看到这个程序时,我很轻松的下了结论:运行结果为-1;
当然……真实运行结果是这样的
那么问题出在哪里呢?
毫无疑问,就在我们标题所说。
第一点,我们都清楚,修饰符signed代表有符号,也就是说,存储单元的最高位用来表示数值的符号。而unsigned当然与之对应的全部二进制位都用来表示数值本身。
第二点,c++程序中,正数以原码存储,负数以补码存储。(或者说正数的补码与原码相同,即它所代表的数的真值)
然后事情就很清楚了。
b值为-1,也就是原码为1000000000000001,对应补码为1111111111111111.
而当其值赋给a时,unsigned修饰符生效,原本代表符号的“1”现在真的代表了1,并且不再代表负数。
所以,本来说好的补码现在就是原码了。
那也就是说,现在的a值对应的数值原码为1111111111111111.也就是pow(2,15)-1,即65535.
所以,如果将unsigned改为signed,那一切恢复正常,最终结果重新变为-1.
另外:
unsigned 无符号数,作用为存储的数据范围大
unsigned char是无符号字节型,char类型变量的大小通常为1个字节(1字节=8个位),且属于整型。整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。 malloc函数是分配内存空间函数,参数是待分配的类型在内存中所占的字节数 例如,二进制数 1000 0001 有符号术是-1,无符号数是129.就是第一位为1时,无符号数把它当数位,而有符号数把他当负号
相关文章推荐
- C/C++ 32位机器和64位机器 差异问题总结 跨平台 移植问题 语言编程需要注意的64位和32机器的区别
- C51程序unsigned和signed类型数据判断时候需要注意的问题
- unsigned和signed、const和define的区别
- 在C#里调用C++的dll时需要注意的一些问题<转>
- Brew中使用C++需要注意的事项
- 内联函数背景、例子、与普通函数的区别及要注意的地方 ------新标准c++程序设计
- win32,win64编程永恒;语言编程需要注意的64位和32机器的区别
- C/C++库中使用time.h中函数需要注意
- c/c++中使用指针需要注意的问题
- C++开发即时通讯软件,需要注意什么?
- 在c#里调用C++的dll时,需要注意的一些问题
- C++重载内存分配时需要注意的地方
- C++ 整数(0,1,2,3)和WORD(unsigned short)的区别
- C语言编程需要注意的64位和32机器的区别
- 学习C++需要注意的问题
- 创建数据表添加unsigned时需要注意的
- 使用C++实现JNI接口需要注意的事项
- C++中方法定义和调用需要注意的一个地方
- 32位C/C++程序移植到64位系统时需要注意的问题
- 语言编程需要注意的64位和32机器的区别