Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317739
  • 博文数量: 57
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 769
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-29 14:57
文章分类
文章存档

2014年(39)

2013年(13)

2012年(5)

我的朋友

分类: C/C++

2014-06-27 11:34:44

1整数转换(包括隐式和显式(使用强制转换))必须保证不会导致丢失或曲解数据。

C99规定:
a.当整数类型的值转换为另一个整数类型除了_Bool,如果该值可以被另一种类型表示,它的值是不变的。
b.否则如果新类型是无符号的,则该值是通过反复增加或减去MAX+1(MAX是新类型可表述的最大值),直到该值在新类型的范围内。
c.否则新类型是有符号的,该值不能用新类型表示;其结果要么是implementation-defined要么引发implementation-defined的信号。

Implementation-defined 指C99没有自己规定,但规定了编译器要明确规定,写在编译器文档中.

错误代码:

点击(此处)折叠或打开

  1. unsigned long int ul = ULONG_MAX;
  2. signed char sc;
  3. sc = (signed char)ul; /* cast eliminates warning */
代码中unsigned long int强制转换为signed  char,导致数据被截断和符号错误。

正确代码:

点击(此处)折叠或打开

  1. unsigned long int ul = ULONG_MAX;
  2. signed char sc;
  3. if (ul <= SCHAR_MAX) {
  4. sc = (signed char)ul; /* use cast to eliminate warning */
  5. }
  6. else {
  7. /* handle error condition */
  8. }


错误代码2:

点击(此处)折叠或打开

  1. signed int si = INT_MIN;
  2. unsigned int ui;
  3. ui = (unsigned int)si; /* cast eliminates warning */
si为INT_MIN转为unsigned int,导致数据错误和符号错误。

正确代码:

点击(此处)折叠或打开

  1. signed int si = INT_MIN;
  2. unsigned int ui;
  3. if ( (si < 0) || (si > UINT_MAX) ) {
  4. /* handle error condition */
  5. }
  6. else {
  7. ui = (unsigned int)si; /* cast eliminates warning */
  8. }

错误代码3:

点击(此处)折叠或打开

  1. signed long int sl = LONG_MAX;
  2. signed char sc;
  3. sc = (signed char)sl; /* cast eliminates warning */
signed long int转换为signed char,导致数据截断。

正确:

点击(此处)折叠或打开

  1. signed long int sl = LONG_MAX;
  2. signed char sc;
  3. if ( (sl < SCHAR_MIN) || (sl > SCHAR_MAX) ) {
  4. /* handle error condition */
  5. }
  6. else {
  7. sc = (signed char)sl; /* use cast to eliminate warning */
  8. }
 
错误代码4:

点击(此处)折叠或打开

  1. unsigned long int ul = ULONG_MAX;
  2. unsigned char uc;
  3. uc = (unsigned char)ul; /* cast eliminates warning */
unsigned long int转化为unsigned char,数据被截断。
正确:

点击(此处)折叠或打开

  1. unsigned long int ul = ULONG_MAX;
  2. unsigned char uc;
  3. if (ul > UCHAR_MAX) ) {
  4. /* handle error condition */
  5. }
  6. else {
  7. uc = (unsigned char)ul; /* use cast to eliminate warning */
  8. }

阅读(704) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~