当表达式中存在有符号类型和无符号类型时
来源:互联网 发布:微信小程序域名未备案 编辑:程序博客网 时间:2024/05/17 05:14
C语言中对于表达式中存在有符号数和无符号类型时,将对计算过程进行如何处理,经常听到的说法是:
“当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型”
以上这种表述是不准确的,正确的结论应为:
“当表达式中存在有符号类型和无符号类型时,默认情况下计算的结果将转化为无符号类型”
而对于计算过程而言,变量本身转化为有符号还是无符号数,都不会改变在计算机中存储的位状态。
参考如下代码:
- int i,j;
- unsigned int x,y,z;
- i = -5;
z = 2;
x = i+z; //unsigned result
j = i+z; //signed result - printf("\033[31m i=-5;\n z=2;\n x=i+z;\n j=i+z; \033[0m\n");
printf("i+z=%d \n",i+z);
printf("x=%d \n",x);
printf("j=%d \n",j);
i=-5;
z=2;
x=i+z;
j=i+z;
i+z=-3
x=-3
j=-3
而如果将printf()函数中的打印类型换成u%即无符号10进制类型时:
- int i,j;
- unsigned int x,y,z;
- i = -5;
- z = 2;
- x = i+z; //unsigned result
- j = i+z; //signed result
- printf("\033[31m i=-5;\n z=2;\n x=i+z;\n j=i+z; \033[0m\n");
- printf("i+z=%u \n",i+z);
- printf("x=%u \n",x);
- printf("j=%u \n",j);
i=-5;
z=2;
x=i+z;
j=i+z;
i+z=4294967293
x=4294967293
j=4294967293
其中,4294967293的16进制表示为0xfffffffd,即是-3的补码。
从上述结果可知,无论是无符号数变成有符号数还是有符号数变成无符号数,其计算结果都是一样的,而结果的值是取决于打印的类型。
______________________________________________________________________________________________
以下代码:
- int i=-5;
- unsigned int z=2;
- if(i+z>2)
- printf("i+z>2 \n");
- else
- printf("i+z<2 \n");
i+z>2
而以下代码:
- int i=-5;
- unsigned int z=2;
- if(((int)(i*z))>2)
- printf("i+z>2 \n");
- else
- printf("i+z<2 \n");
i+z<2
原因是在逻辑表达式判断中,i+z>2 中左侧的值需要表现为无符号类型,因此呈现为一个较大的正数。将+号改成乘号结果也一样。
因此,可信的结论应该是:
有符号数和无符号数相加时,结果的二进制表达式不受何种符号类型影响的,而计算结果的值取决于结果所需呈现的类型。
当有符号数和无符号数出现在同一个表达式中,默认状态下(如果不像上述代码那样作强制转换)表达式的值为将结果转化为无符号类型的值。
全文参考:http://blog.chinaunix.net/uid-22468533-id-2847343.html
- 当表达式中存在有符号类型和无符号类型时
- 当表达式中存在有符号类型和无符号类型时
- 有符号类型和无符号类型
- C++中有符号类型与无符号类型对比
- 无符号类型和有符号类型的比较是个坑
- C++中含有无符号类型的表达式——有符号数与无符号数相加
- 带符号类型和无符号类型
- int类型有符号与无符号内存中 -- C
- c语言有符号数和无符号类型计算
- 判断类型是无符号类型还是有符号类型
- C语言中有符号数和无符号数类型转换的用法深度解析
- 有符号类型与无符号类型之间的转换
- 有符号类型自动转为无符号类型
- java中将有符号类型转换为无符号类型
- C++ 中有符号类型到无符号类型的转换
- C表达式中出现有符号数和无符号数时编译器处理的规则
- C++ 中含有无符号类型的表达式
- C/C++中关于含有无符号类型的表达式
- Virtual networking in Linux
- outlook express 邮件导入 outlook
- C 递归
- 心得7-hibernate级联之多对多转换为多对一的问题剖析
- 端口映射(转发)、MAC绑定、DDNS、远程开机基础知识
- 当表达式中存在有符号类型和无符号类型时
- 《Android系统学习》之bug定位
- UML中的泛化、依赖、关联、聚合、组合关系
- 心得8-hibernate 高级映射
- [Android实例] 适应多行长文本的Android TextView
- mysql索引问题
- hadoop在对数据压缩时出现的问题
- oracle 中的Union的用法
- IOS之文件夹创建、删除,图片在本地的保存和加载