补码的认识 类型转换
来源:互联网 发布:java 获取文件修改时间 编辑:程序博客网 时间:2024/05/16 14:34
关于补码的一些认识:
1.强制类型转换不改变参数在计算机中的表示,位的表示没有改变,改变的只是如何将这些位解释成数据。。
看看下面的代码:
unsigned int x ;
int y = -2;
x = y;
print_binary(x);
print_binary(y);
unsigned char a;
char b = -2;
a = b;
print_binary(a);
print_binary(b);
short int n = 12345;
short int mx = -n;
print_binary(n);
print_binary(mx);
逐个验证,都是成立的,注意对于最后一个,不是强制类型转换,而是取相反数,这个当然是要变的,补码,取反加1. OK
2.先看看这个误区。对于:
int num = 0x12345678;
char *pnum = (char *)#
for (int j = 0; j < 4; j++ )
{
printf("%.2x" ,pnum[j]);
}
for (int j = 0; j < 4; j++ )
{
cout << hex << pnum[j] << " ";
}
为何输出的内容是:
78563412
x V 4
请按任意键继续. . .
X ----- “78”
printf("%x",'x');
输出即为78.
为何前者输出的是正确的结果而后者不是呢?很简单,前者格式化输出为2位的16进制数,而后者则认为它是字符,因为是char*类型。看了C++和C的不同也在于此啊。(追问:那么C++中的表示呢?)该语句中,即使是hex,还是输出来的是的是ASCII对应的字符。。。(查查hex等的具体用法)
3.小端法表示:
//该函数模板实现了将某类型的变量各位输出来看看。。
template <typename T>
void print_binary(T n)
{
for ( int i = sizeof(n)*8 - 1; i >= 0; i-- )
{
cout <<(( n >> i ) & 1 ) << (i % 8 == 0 ? " " : "");
}
cout << endl;
}
for (int j = 0; j < 4; j++ )
{
printf("%.2x",pnum[j]);
printf(" ");
}
print_binary(pnum[0]);
输出:
78 56 34 12
0111 1000
请按任意键继续. . .
上面这个代码就是将第一个类型的单元输出来看看。注意,我这里用到的这个模板函数很好,通过它我可以知道任何类型的变量。显然pnum[0]是一个char类型的。而看看里面的部分,哈哈,刚好就是7和8对应的二进制表示了。。。所以说:计算机可以寻址的最小单位是一个字节。而这个字节的内部,它是无法得到的,更是无法改变的,intel机都是用的小端法表示的,所以地位的78显示在前面,但是表示78的内部的二进制位,却没有按照这个来,注意,前面所说的。。
4.关于unsigned和signed的几点说明:
前面说过,表示是不变的。可是如果格式化输出的时候要注意形式。
先看看下面的代码:
#include <iostream>
using namespace std;
int main()
{
int x = -8;
unsigned int y = x;
printf("%d\n",x);
printf("%d\n",y);
printf("%u\n",x);
printf("%u\n",y);
int a = -12;
int b = 8;
printf("%d\n",a+b);
printf("%d\n",(unsigned)a+b);
printf("%u\n",(unsigned)a+b);
printf("%u\n",a+b);
int c = -1;
printf("%d\n",c);
printf("%u\n",c);
printf("%u\n",(unsigned)c);
return 0;
}
-8
-8
4294967288
4294967288
-4
-4
4294967292
4294967292
-1
4294967295
4294967295
请按任意键继续. . .
%d和 %u表示不同的输出格式,前者是有符号的,后者是无符号的。如果类型不一致,那么会按照这个格式来转换的,比如一个unsigned的类型,那么用%d就会自动转换成有符号的。。特别注意。
//用这个函数模板来实现输出各位。。。
template <class T>
void print_binary(T a)
{
for ( int i = sizeof(T) * 8 - 1; i >= 0; i-- )
{
cout << (( a >> i ) & 1) << (i % 8 == 0 ? " " : "");
}
cout << endl;
}
- 补码的认识 类型转换
- 隐式类型转换&& 负数的补码
- 隐式类型转换&& 负数的补码
- 类型强制转换与计算机的原码,补码,反码
- 关于struts2中类型转换的认识
- 关于对补码的认识!
- 补码认识
- 举例加深对补码运算的认识
- 对C++中类类型的转换的认识
- 转换为二进制的补码
- 强制类型转换的认识(有待判别)
- 类型转换与对象的多态认识
- C语言中类型转换时的截取规则及补码表示的计算方法
- 源码 、反码、补码 以及java基本类型转换
- 对C++中类型显示转换操作符const_cast<类型>(变量)的认识
- 关于补码及整型的最小值的认识
- JAVASE总结--02(注释、标识符、数据类型、源码、反码、补码、浮点数为什么那么能装、变量、类型的转换)
- 原码与补码的转换
- 前台页面反序列化Newtonsoft.Json序列化的时间问题
- [OpenGL] 基于win32api建立多窗口GL应用程序
- //创建自己
- Oracle EBS系统安装相关的Note以及相关的文章
- 准备
- 补码的认识 类型转换
- mysql小技巧、存储过程
- poj 1065 Wooden Sticks
- WSAAsyncSelect发送和接收数据
- 括号匹配问题
- 商业模式与盈利模式定义及区别
- 文件流操作
- Centos学习笔记(一)
- 线程堆栈