首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

玩儿转C语言:整数及有关操作

2012-12-26 
玩儿转C语言:整数及相关操作1、C语言中整数有几种进制表示方式?使用时要注意哪些问题?C语言中可以以多种进

玩儿转C语言:整数及相关操作

1、C语言中整数有几种进制表示方式?使用时要注意哪些问题?

        C语言中可以以多种进制表示整数:2进制、8进制、10进制和16进制。每个进制都有其对应的表示方式:2进制以0b开头,例如0b10111110,;8进制以0开头,例如0144表示的是10进制的100;10进制正常表达即可,不需要特殊转换;16进制以0x开头,例如0xFF表示0b11111111。实际使用中,要注意8进制和10进制的表示方式非常接近不要混淆,010和10是不同的两个数,在变量定义中,有时为了格式对齐的需要,可能会无意中将十进制数据写成了八进制数据,如:045(8进制),124(10进制),068(8进制)等等,他们并不是十进制数据:45,124,68。

2、C语言中整数的类型大小如何定义的?使用时要注意哪些问题?

        C语言中有3种长度的整数:short型、int型和long型。ANSI虽然没有规定这些类型具体占用几个字节(8bit)大小,但是规定了long型整数长度至少是32bit,short型和int型长度至少16bit,3种类型的整数长度非递减(short <= int <= long)。实际使用(尤其是嵌入式开发)中,不同的环境具体实现不同,要明确这些类型所占空间大小,确保数据满足需要不会发生溢出。我带过的实习生在开发中,就曾发生过拿uint_8数据跟300去比较的情况。

3、在进行整数变换时要注意哪些问题?

        C语言允许不同类型的整数之间相互转换,例如16位数据赋值给8位变量(数据截断)或者8位数据赋值给16位变量(数据扩展)。当发生“数据截断”时可能会出现数据丢失,编译器把16位数据分成2个8位数组块,取某一块分配给8位变量,取高8位还是低8位取决于编译器对数据的存放规则是大端还是小端,一般说来小端取低8位大端取高8位,具体以实际数据为准。当发生“数据扩展”时可能会出现数据错误,尤其是源操作数和目的操作数一个是有符号类型一个是无符号类型时。如果两个操作数都是无符号型,则扩展的高数位补0;如果两个操作数都是有符号型,则扩展的高数位补1还是0取决于当前源数据是正数还是负数,正数补0负数补1;当源数据是无符号型目的数据是有符号型,因为无符号型本身全是正数,所以直接当正数处理补0即可;当源数据是有符号型目的数据是无符号型,如果源数据是正数直接赋值补0,如果是负数就要看编译器了,因为这涉及到最高位是当符号位处理还是数据位处理的问题。需要特别注意的是char类型字符向整数转换时,有的编译器会当做无符号处理而有的编译器会当做有符号处理,结果相差很大。上面这些讨论不是要得出一个万无一失的结论,实际操作效果根据编译器和操作系统而定。

4、进行整数移位运算时需要注意哪些?

        整数的一些操作可以用移位运算来简化和提高效率,例如无符号整数的除法等等,不过现在这种需求不是很强烈,因为现代编译器相当“智能”基本可以识别这些需要进一步优化的运算(优化级别需用户指定),而且在进行移位操作时很可能会引入其他问题。所以,具体是修改成移位运算还是靠编译器默认优化,都依实际项目需要进行试验后而定。无符号数向右移位,空出的位被0填充;有符号数向右移位,空出的位被符号位(最高位)的副本填充。不同的编译器对移位计数限制不同,有的编译器限制移位计数必须大于等于0小于32(对于int值占4字节时);有的编译器就没有这个限制甚至连负数都可以接受,例如vs2010。

(1)vs2010下移位计数为正数时结果如下:

            玩儿转C语言:整数及有关操作

        分析:原始数据被初始化成了负数0x92345678,右移1位则空位由符号位1填充变为0xc91a2b3c,当右移31位符号位持续填充变为0xffffffff;关键是右移32位时数据并没有变成全1而是而是保持不变;右移33位时数据等效于右移1位;右移43位数据等效于右移11位;右移64位等效于右移0位。则可以分析出在vs2010下,当移位计数是正数时,如果小于32则依照移位规则运算(正数和负数不同),当移位计数大于31时,编译器会对移位计数以32取模,以该结果为新的移位计数值进行运算。注意:这个结果只对vs2010有效,前提是int数据占4个字节。如果是其他编译器或者其他数据类型,可试验分析基本大同小异。

(2)vs2010下移位计数为负数时结果如下:

           玩儿转C语言:整数及有关操作

        分析:当移位计数是负数时,vs2010并没有报错,而且有实际数值输出。经过分析,可以看到编译器对移位计数值加上N个32,直到计数值变成正数为止,然后再以新的计数值(小于32)进行数据移位操作。上面两个实验都是针对负数操作的,对于正数的情形类似。同理,这里的数据结果也都是针对特定平台而言,具体项目需要试验分析。

热点排行