关于有符号数、无符号数和数据类型的总结(草稿)
来源:互联网 发布:程序员学什么专业 编辑:程序博客网 时间:2024/06/07 21:15
原文地址:
http://blog.sina.com.cn/s/blog_551489c00100g0q0.html
内存里有 一个字节x 为:0x EC ,一个字节 y 为:0x 02 。当把x,y当作有符号数来看时,x = -20 ,y = +2 。当作无符号数看时,x = 236 ,y = 2 。下面进行加运算,用 add 指令,得到的结果为:0x EE ,那么这个 0x EE 当作有符号数就是:-18 ,无符号数就是 238 。所以,add 一个指令可以适用有符号和无符号两种情况。(呵呵,其实为什么要补码啊,就是为了这个呗,:-))
乘法运算就不行了,必须用两套指令,有符号的情况下用imul 得到的结果是:0x FF D8 就是 -40 。无符号的情况下用 mul ,得到:0x 01 D8 就是 472 。
二、
C又是可怕的,因为它把机器层面的所有的东西都反应了出来,像这个有没有符号的问题就是一例(java就不存在这个问题,因为它被设计成所有的整数都是有符号的)。为了说明c的可怕特举一例:
#include <stdio.h>
#include <string.h>
int main()
{
}
结果应该是 -1 但是却得到:2147483647 。为什么?因为strlen的返回值,类型是size_t,也就是unsigned int ,与 int 混合计算时类型被自动转换了,结果自然出乎意料。。。
观察编译后的代码,除法指令为 div ,意味无符号除法,即将-2看做无符号数了。
解决办法就是强制转换,变成 int y = (int)(x - strlen(str) ) / 2; 强制向有符号方向转换(编译器默认正好相反),这样一来,除法指令编译成 idiv 了。我们知道,就是同样状态的两个内存单位,用有符号处理指令 imul ,idiv 等得到的结果,与用无符号处理指令mul,div等得到的结果,是截然不同的!所以牵扯到有符号无符号计算的问题,特别是存在讨厌的自动转换时,要倍加小心!(这里自动转换时,无论gcc还是cl都不提示!!!)
为了避免这些错误,建议,凡是在运算的时候,确保你的变量都是 signed 的。
三、自动类型转化时的,短字节向长字节转化时,有符号数会符号扩展,无符号数会0扩展;长字节向短字节转化时,会自动截取高位,留下低位字节。特别在做算术运算时,比如乘除法,就可能涉及到有符号数自动转化为无符号数,从而采用不同的指令处理。
例如:下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
四。特别注意在有常数的算数表达式中,往往有隐含的数据类型转化,因为整数常量并没有明确的被指出其的数据类型,
整常数在不加特别说明时总是正值。如果需要的是负值,则负号“-”必须放置于常数表达式的前面。
每个常数依其值要给出一种类型。当整常数应用于一表达式时,或出现有负号时,常数类型自动执行相应的转换,十进制常数可等价于带符号的整型或长整型,这取决于所需的常数的尺寸。
八进制和十六进制常数可对应整型、无符号整型、长整型或无符号长整型,具体类型也取决于常数的大小。如果常数可用整型表示,则使用整型。如果常数值大于一个整型所能表示的最大值,但又小于整型位数所能表示的最大数,则使用无符号整型。同理,如果一个常数比无符号整型所表示的值还大,则它为长整型。如果需要,当然也可用无符号长整型。
但是,可以在一个常数后面加一个字母l或L强制其数据类型,则认为是长整型。如1 0 L、7 9 L、0 1 2 L、0 11 5 L、0 X A L、0 x 4 f L等。
L, U, LU,叫类型后缀,.
变量,常量一般都已经规定了类型了的,所以后缀针对的是字面量.
由于语言默认,整数是int型.即字面量 12 是 int型的.
如果要表示 长整型的12 就得加后缀 12L,无符号的 12U,无符号长整型的12UL.
具体这些有什么用,你需要了解整数在内存中的存放形式...存放长度(位)...
- 关于有符号数、无符号数和数据类型的总结(草稿)
- 关于有符号数和无符号数的探讨
- 【1】ptr = malloc(0*sizeof(char))【2】关于typedef的用法总结【3】关于有符号数、无符号数和数据类型的总结
- 【1】ptr = malloc(0*sizeof(char))【2】关于typedef的用法总结【3】关于有符号数、无符号数和数据类型的总结 .
- 关于有符号数和无符号数
- 汇编有符号数和无符号数总结
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 无符号数和有符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 有符号数和无符号数
- 关于有符号数与无符号数的建议
- 关于有符号数与无符号数的建议
- 有符号数和无符号数间的比较.
- oracle海量数据加快创建索引速度
- JS笔记:检测客户端(引擎、浏览器、平台、操作系统、移动设备)
- php-Arrays 函数-array_combine-用两个数组的值作为新数组的键与值来新建一个数组
- 07---jsp标签编程04(迭代标签)
- 隐式声明与内建函数不兼容问题
- 关于有符号数、无符号数和数据类型的总结(草稿)
- 关于《创建组件**失败。错误消息为**未能加载文件或程序集**或它的某一个依赖。系统找不到指定文件。》的解决方案
- 解决S5pv210 adb push u-boot.bin /system 的失败问题
- Activity的四种launchMode
- 07---jsp标签编程05(BodyTagSupport)---以后补充
- 密码加密方式总结
- [转]理解有符号数和无符号数
- Linux2.6物理内存管理
- go语言/golang实现base64加密解密