类型转换中的符号扩展问题
2011-09-12 15:42
405 查看
由窄字节类型(如char)向宽字节类型(如int)转换,会遇到符号位的扩展问题
例如
http://topic.csdn.net/u/20081030/15/aeae3a59-83da-41ba-83e3-9f13f0499fef.html
的例子
isspace(int)函数接受整形参数对nptr类型的转换:确保从 *nptr++ 到 c 是进行零扩展而不是符号扩展,保证 c 中存放的是一个unsigned char 所能表示的值。http://topic.csdn.net/t/20061013/16/5080821.html符号扩展导致溢出的例子:
printf( "%x\n ",a);实际上就是printf( "%x\n ",(int)a);
a由1一个字节扩展为4个字节。因为char默认为signed,所以编译器将进行符号位扩展
a: 1000 0000
(int)a: 1111 1111 1111 1111 1111 1111 1000 0000
所以最终结果为 0xffffff80
例如
http://topic.csdn.net/u/20081030/15/aeae3a59-83da-41ba-83e3-9f13f0499fef.html
的例子
long __cdecl atol(const char *nptr) { c=(int)(unsigned char)*nptr++; while(isspace(c)) { ++nptr; } }
isspace(int)函数接受整形参数对nptr类型的转换:确保从 *nptr++ 到 c 是进行零扩展而不是符号扩展,保证 c 中存放的是一个unsigned char 所能表示的值。http://topic.csdn.net/t/20061013/16/5080821.html符号扩展导致溢出的例子:
//unsigned char a = 0x80;//char的范围是-128~127 printf("%x\n",a);//%x:16进制
printf( "%x\n ",a);实际上就是printf( "%x\n ",(int)a);
a由1一个字节扩展为4个字节。因为char默认为signed,所以编译器将进行符号位扩展
a: 1000 0000
(int)a: 1111 1111 1111 1111 1111 1111 1000 0000
所以最终结果为 0xffffff80
相关文章推荐
- 有符号与无符号的类型转换以及数位扩展问题
- 无符号数运算问题——C语言隐式类型转换
- C++中有符号类型(int)和无符号类型(unsigned int)混合算术运算的类型转换会出现的问题
- C++中有符号类型(int)和无符号类型(unsigned int)混合算术运算的类型转换会出现的问题
- c++类型转换时的符号位扩展
- 关于类型转换时的“符号扩展”
- 按位“或”运算符在带符号扩展操作数上使用;请考虑首先强制转换为较小的无符号类型
- 解决vs2013 error C4308: 负整型常量转换为无符号类型问题(转载)
- [ZT]TBuf 和 Hbufc数据类型的相互转换问题
- 一个很不好解决的问题 哟(control类型到combobox或到textbox的转换)
- 谈谈Nullable<T>的类型转换问题
- eclipse中的Date类型转换问题
- 服务器网站报错:由于扩展配置问题无法提供您请求的页面,请添加MIME映射,针对mp4,flv文件类型无法打开。
- VS2008环境中LPCWSTR类型转换问题解决方法
- Entity Framework 更新数据库 datetime 类型的问题 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值。
- C语言中malloc函数返回值是否需要类型强制转换问题
- 一个问题:关于类型转换Type Cast(汇编讲解 as 语法)
- 函数返回值C语言中malloc函数返回值是否需要类型强制转换问题
- 有符号数据类型的范围问题--解开自己心中的迷惑
- java中的类型转换问题