C语言中的整数自动转换原则

转载 2007年09月16日 15:19:00

有符号数与无符号数之间运算问题
以下实验均在virual c++6中运行通过
这个问题测试是否懂得C语言中的整数自动转换原则,有些开发者懂得极少这些东西。当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。
首先进行一个实验,分别定义一个signed int型数据和unsigned int型数据,然后进行大小比较:
    unsigned int a=20;
    signed int b=-130;
a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?
这是因为在C语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理,因此a=20,b=4294967166,这样比较下去当然b>a了。
再举一个例子:
 unsigned int a=20;
 signed int b=-130;
 std::cout<<a+b<<std::endl;
结果输出为4294967186,同样的道理,在运算之前,a=20,b被转化为4294967166,所以a+b=4294967186

减法和乘法的运算结果类似。

如果作为signed int型数据的b=-130,b与立即数之间操作时不影响b的类型,运算结果仍然为signed int型:
signed int b=-130;
std::cout<<b+30<<std::endl;
输出为-100。

而对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。

 

相关文章推荐

C语言基本数据类型及转换规则

C语言的基本数据类型;有点奇怪的是为什么float和double不用signed/unsigned修饰。 符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输...

C语言运算中的数据类型自动转换原则

1、隐式转换     C在以下四种情况下会进行隐式转换:        1、算术运算式中,低类型能够转换为高类型。        ...

喜欢的句子

--Better late thannever. --Stay Hungry,Stay Foolish. --Try to innovative ways when you’re stuck. --每...

栈内存学习

栈是一种数据结构,栈是一种思想(后进先出),栈应用于栈内存的分配。 那么数据是如何存入栈中的呢? 栈的存储方向是从高地址往低地址,栈底永远在栈的最高地址,栈顶随压栈、出栈动态移动,一直指向栈的最低...

C语言宏中#和##的用法 -- 2010.10.30高通笔试

权威参考资料: C99:6.10 Preprocessing directives C99地址:http://download.csdn.net/source/2628619     下面是...

你是哪个级别的工程师?

例子:标准C语言的Hello World! #include int main( void ) { printf("Hello World!/n"); return 0; } ...

字符编码

1、ASCII编码(0-127) 2、(128-255):IBM EASCII、ISO-8859-1(Latin-1) 3、Unicode == UCS 编码长度为31...

C语言在32位和64位系统上各类型所占字节数

引言        对比表     小结

C语言数据类型转换 - 图解

C语言中数据类型转换 - 图解: 结合着上一篇来理解它们之间转换关系。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)