[C语言]unsigned int与 int

原创 2013年12月01日 20:29:42

有时间记录一点东西。

上周在食堂吃饭时,遇到师弟,提到一个与unsigned相关的问题,大致意思是表达式运算中有unsigned类型,导致结果跟预期结果不一致(预期结果为负数,结果实际为一个大整数)。晚上吃饭回去看了看他发的问题。很快就回复他因为unsigned int 的原因导致表达式中所有的int型都提升为unsigned int。后来就这个问题,又继续追问了几个。

后来的讨论中,查了《C程序设计语言》及网上信息,直到确认没有问题。

结论有俩:

1、表达式运算中若有unsigned int (uint),则int 类型提升为unsigned int。若uint前使用“-”号,则仍为uint型。

2、赋值运算时,若右值为uint,左值为int,则会产生类型转换,即uint最高位作为符号位转换。printf同理。


问题起源于表达式:k = ( -l/z + 1)/a; 其中,除l为uint之外,其它都为int型。

举例代码如下:

	unsigned int a = 4;
	int b1, b2, b3;
	b1 = -a/1;
	b2 = -a/2;
	b3 = -(a/2);

	printf("b1 = %d,\tb1 = %x\n", b1, b1);
	printf("b2 = %d,\tb2 = %x\n", b2, b2);
	printf("b3 = %d,\tb3 = %x\n", b3, b3);

VS2008编译时会有warning:负运算符作用于无符号类型时,其结果仍为无符号类型。

运行结果如图:



由结果可知道,uint参与的表达式运算、赋值过程中发生了整形提升和类型转换。即结论的验证。这里只涉及到了uint与int型之间的转换。因unsigned不同类型间的转换都有一定的区别,这里没有涉及。


【补充】 嵌入式中的 *(volatile unsigned int *)理解

先看一个例子:*(volatile unsigned int *)0x500 = 0x10 ①(unsigned int *)0x500:将地址0x500强制转化为int型指针 ②(unsi...
  • czg13548930186
  • czg13548930186
  • 2017年06月12日 13:11
  • 892

char 和 unsigned 与int 之间的转换

char 和 unsigned 与int 之间的转换,并通过char 和 unsigned 转换成 int 的不同之处,思考char 与 unsigned char 的区别...
  • yifeiboss
  • yifeiboss
  • 2016年08月14日 21:20
  • 4303

int与unsigned等转换深入理解(二)

1、隐式转换     C在以下四种情况下会进行隐式转换:        1、算术运算式中,低类型能够转换为高类型。        2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并...
  • qq_24373811
  • qq_24373811
  • 2016年10月25日 14:50
  • 2360

unsigned int 类型使用谨记

转载来源:http://blog.csdn.net/ljianhui/article/details/10367703 尽量避免有符号数与无符号数的比较运算和避免减法运算,在很多时候...
  • kkkkkkkooooooo111
  • kkkkkkkooooooo111
  • 2016年12月16日 22:24
  • 2051

都是类型惹的祸——小心unsigned

正如我们所知道的,编程语句都有很多的基本数据类型,如char,inf,float等等,而在C和C++中还有一个特殊的类型就是无符号数,它由unsigned修饰,如unsigned int等。大家有没想...
  • ljianhui
  • ljianhui
  • 2013年08月27日 00:39
  • 28542

c++ unsigned和int类型转换及运算

一、规则总结 1. 在c++中,如果赋值给无符号类型一个超过它表示范围的值(如负数),结果是初始值对无符号类型表示数值最大值取模后的余数。 2. 在c++中,如果表达式中同时有无符号类型和有符号类型,...
  • chenyuxin32
  • chenyuxin32
  • 2017年02月08日 10:02
  • 2143

【剑指offer】数值的整数次方

题目描述:        实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 分...
  • To_Be_IT_1
  • To_Be_IT_1
  • 2014年07月10日 07:22
  • 855

signed和unsigned之间以及移位操作相关左移和右移

转载,很好的文章 http://blog.sina.com.cn/s/blog_4c7fa77b01000a3m.htmlsigned和unsigned之间 昨天,zrf师兄丢给我这样...
  • wangqing008
  • wangqing008
  • 2014年10月19日 13:16
  • 1363

int和unsigned int解析和扩展

就如同int a;一样,int 也能被其它的修饰符修饰。除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char、int。In...
  • u010923083
  • u010923083
  • 2017年04月27日 02:04
  • 69

(嵌入式开发)自己写bootloader之编写第二阶段

1   内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。 ...
  • qq1028951741
  • qq1028951741
  • 2016年03月22日 21:35
  • 599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[C语言]unsigned int与 int
举报原因:
原因补充:

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