语言 unsigned 和 signed 类型相互转换深入理解
2013-04-25 15:40
260 查看
转载请注明出处 /article/5257095.html
#include <stdio.h> int main(int argc, char *argv[]) { unsigned char a = -1; char b = a; printf("%d %d",a,b); return 0; }
//结果:255 -1
#include <stdio.h> int main(int argc, char *argv[]) { unsigned short a = -1; short b = a; printf("%d %d",a,b); return 0; } //结果:65535 -1
这是两段很简单的代码,我就以第二段代码为例。
在计算机中,负数是以补码来存储的。 转载请注明出处/article/5257095.html
C语言中常量整数 -1的补码表示为0xFFFFFFFF。截取后面16位FFFF赋值给 变量a(unsigned short)。此时 a = 0xFFFF(a没有符号位,0xFFFF转换为十进制为65535)。
a又将0xFFFF,直接赋值给short b。 此时 b = 0xFFFF(但是要注意,b是有符号的,0xFFFF转换为十进制为-1)。
执行printf("%d %d",a,b);的时候,要将 a和b的值先转换为int型:
a没有符号所以转为int型为0x0000FFFF,
b有符号转换为int型为0xFFFFFFFF。
十进制输出值 65535 -1. 转载请注明出处/article/5257095.html
#include <stdio.h> int main(int argc, char *argv[]) { unsigned int a = -1; int b = a; printf("%d %d",a,b); return 0; } //结果 -1 -1
转载请注明出处/article/5257095.html
a在内存中值为0xFFFFFFFF,b的值为0xFFFFFFFF,都已经32位,
a转换为int型的时候就是0xFFFFFFFF,所以输出-1.
其实,记住两点就行了
1.unsigned 类型转换为 signed类型的时候是直接复制到低位,高位为0.如果signed类型位数不够,只直接装载unsigned低位。
2.signed类型转换为unsigned类型的时候,也是将补码直接复制到低位,高位为符号位。如果unsigned位数不够,只直接装载signed低位。
相关文章推荐
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法
- 深入理解指针类型间的转换
- 【深入理解计算机系统】【C表达式类型转换顺序】
- [深入理解C++(一)]类型转换(Type Casting)
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- Go语言中不同类型切片之间的相互转换
- 深入理解C++对象模型之类型转换:ReinterpretCast
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
- [深入理解C++(一)]类型转换(Type Casting)
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- 深入理解C指针四(指针类型转换)--By kmalloc
- 【转载】深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换 [转]