这里说一下C的强类型转换,也是C++的static_cast。
在小端的机器实验了一下,
从位数多的类型(例如int64)转到位数少的类型(例如int32)是直接截取的,
这种情形是十分简单明了的。
不过不同环境底层的策略可能不大一样。
而反过来,从位数少的到位数多的,就稍微复杂一点,
在我的实验环境中,例如从a到b,首先会判断a是不是有符号的,
如果a是无符号的,那直接一个内存拷贝完事,
否则会判断是否为负,然后用0或1填充b中的高位,不管b是否有符号。
如果涉及加减乘除等复杂运算的都转为有符号的,都转为有符号的吧。
因为无符号遇到负数就悲剧了,用有符号的,在数据范围内都不会出错。
这个转换情况繁多,有一点是不变的是:数据对应内存段的bit串是一样的。
实验代码
#include <iostream> #include <iomanip> using namespace std; //CPU@E5520,g++4.1.2 //2.6.18Linux_x86_64 int main() { //有符号整型之间的转换,从32到64正确! int int0 = 1, int1 = 2; long long t0 = int0 - int1; cout << "t0 = " << t0 << endl; //无符号做减法之后,理论上是个负数 //但转换时被认为是无符号的,高位也不用什么处理了 unsigned int uint0 = 1, uint1 = 2; long long t1 = uint0 - uint1; cout << "t1 = " << t1 << endl; //在同数量位数下,例如都是32位的 //无符号与有符号的运算首先会转成无符号的 long long t2 = uint0 - int1; cout << "t2 = " << t2 << endl; long long x0 = -2134864623938L; int x1 = x0; unsigned int x2 = x0; cout << setbase(16) << x0 << endl; cout << setbase(16) << x1 << endl; cout << setbase(16) << x2 << endl; //y1虽为无符号直接,但还是根据y0的正负填充高位 int y0 = -1; unsigned long long y1 = y0; cout << setbase(10) << "y1 = " << y1 << endl; return 0; }
运行结果:
t0 = -1
t1 = 4294967295
t2 = 4294967295
fffffe0ef02706be
f02706be
f02706be
y1 = 18446744073709551615
好吧,强制转换,去掉const修饰作用是令人一件不愉快的事情。
因为程序失去了原有的const语义,所以即使用了cast_const强制转换,
也务必人肉保证对用户态const是有效的。
相关推荐
分别实现了字符串与整型数字之间的转换, 重点烛字符串与浮点数之间的转换
16进制与10进制数据转换工具,主要用于程序读写PLC,单片机等数据时读取的16进制数据转换成10进制的数,解决初学者的疑惑,数据在单片机或PLC中存储时是以bit、字节为单元存储的,不管是整型数还是浮点数,最终都是...
可以实现字符串转换为整型,这也是我查找了很多的额资料才写成的小程序,希望对你有所帮助
二 八 十 十六进制间的任意转换 二 八 十 十六进制间的任意转换 二 八 十 十六进制间的任意转换
string,Cstring,char*,int,long,float,double等类型之间的相互转换总结,包含了所有的转换方法。
一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问下面笔者就开发中的一些体会介绍给大家。 我们知道,...
浮点数整数转换工具,用于浮点数与整数之间相互转换
C++中字符串与整型浮点型间的转换或者与其他类型之间的转换是我们经常遇到的问题,本人总结了一下网上的资源,与大家分享一下
C语言程序设计(第2版)-2期 拓展知识2-4 整型数据之间的转换.pdf 学习资料 复习资料 教学资源
MySQL中存在INET_ATON() 、INET_NTOA()函数进行IP整型和字符串之间的转换,那么Python中存在什么方法可以实现MySQL中INET_ATON() 、INET_NTOA()的功能呢?方法肯定是有的~ 方法如下 # 导入相关模块包 import ...
SQL Server中,在“整型数字”和“字符串表示的十六进制数字”之间进行转换的函数: IntToHex 数字转十六进制 HexToInt 十六进制转数字
2. 数值类型之间的相互转换; 3. 字符的 ASCII 码和 Unicode 码; 4. 数值字符串和数值之间的转换; 5. 字符串和字符数组之间的转换; 6. 字符串和字节数组之间的转换; 7. 各种数值类型和字节数组之间的转换; 8. ...
16进制与有符号10进制间的相互转换,支持16进制数转换为有符号10进制数,或将有符号10进制转换为16进制数,可选包含1、2、4、8字节。
c语言的itoa:char *m_itoa(int n) 整数转换为字符串。char *m_itoh(unsigned int num, int length, ... 0: 不加前缀,字节间加空格:FF FF FF FF; char* m_ftoa(float n) 浮点转为字符串; STM,Arduino,各种单片机的C开发
UTC时间使用的是32位整型实现.没有使用64位.因此只能存储约132年之间的时间. 单位为s. 同时附上一个UTC转换工具.便于对比UTC时间转换是否正确. 工具会把时间自动从UTC时间转换成年月日后进行时区校正.因此如果想要...
将一个正整数n(长整型)输出成“千分位”形式,即从个位数起,每三位之间加一个逗号,例如,将7654321输出成7,654,321; 运行.dsw文件后会生成debug文件夹,下面有.exe可以直接运行
该代码可以实现单精度浮点数和16进制字符之间的转换,包含源代码
以上这些函数是最基本的几个数据进制之间的转换函数,其中以前三个函数最常用,也最有用.从上面几个函数我们可以看到,VB中没有为我们提供专门的函数供我们将表达式或是数据转换成十进制和二进制,不过十进制的转换我们...
复制代码 代码如下: /*数据类型之间相互转换 * 一种是强制转换 * setType(变量,类型); //int,integer,float,double等等。 * 这个函数将原变量的类型改变,用var_dump();可以查看变量 * * 在赋值前使用(类型)的形式,...