分类: LINUX
2010-09-16 10:54:19
今日内容:
熊磊光老师 Email: lxiongleig@gmail.com
正数 负数
5 -5
原码 00000101 00000101
反码 00000101 11111010按位取反
补码 00000101 11111011加一
位运算符
计算机中为什么会用补码表示负数?
如果用在正数最高位置1的方式表示负数会存在 0的表示不唯一,在计算机中做减法运算都是加一个负数实现的,如果用这种表示方式,需要经过:比较符号位,比较绝对值,加法改减法,减法改加法,小数减大数改成大数减小数……等运算,非常不便于做减法运算。
补码为什么是按位取反,末位加1的?
A,B 为八位二进制数。例子:(A)- (B)= (A)+(0xff + 0x01 – 0x100) –(B)
= (A) +(0xff – (B) +1) -0x100= (A) + (B的补码) – 0x100(产生的高位溢出)。
显式类型转换,隐式类型转换
今日内容:
郭同彬老师:Email :guotongbin@akaedu.org。
1.当小数据类型向大数据类型转换时要保证数据符号(正负)
2.当大数据类型想小数据类型转换时采取截取的方式转换。
当两个字符类型的变量相加时会产生整形提升,先将字符形变为整形,再做相加。
当有符号数向无符号数转换时会先将有符号书转换为无符号数
区分b << 1 和b <<= 1 前者b的值没有改变。浮点数做判断是否相等时,不能用==,需要判断其差是否为一个可控范围内 dx 是否小于某个值。
objdump -ds file.o > file.s 对程序进行反汇编。sizeof 中的表达式 不做计算。任何小于整形的类型作运算时,都要作整形提升。
位运算:&, |,^异或,~非,
掩码:读操作,置1,归零运算。
读:unsigned int a, b, mask= 0x0000ff00;
a = 0x12345678;
b = (a & mask) >> 8// 0x00000056;
置1:unsigned int a, b, mask = 0x0000ff00;
a = 0x12345678;
b = a | mask; // 0x1234ff78;
归零:unsigned int a, b, mask = 0x0000ff00;
a = 0x12345678;
b = a &~mask; //0x12340078;
异或操作:
任何数和0异或总保持其原值,和1异或都会翻转原值。
chinaunix网友2010-09-16 16:57:18
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com