c语言long long(int64)和int(int32)之间如何安全的互相转换?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言long long(int64)和int(int32)之间如何安全的互相转换?相关的知识,希望对你有一定的参考价值。

如题:
在C语言中带符号的64位int和32位int如何安全的互相转换?
比如32位转64位时负数不丢失符号;
64位转32位时如果正数很大丢失一部分高位数值,但转换后的32位不会变成负数;
还有负数的64位转32位

int aa = (Int32)((((long)4294917296) << 32)>>32);

int32赋值给int64,因为int64的表示范围更大,此时直接赋值,一定安全;

int64赋值给int32,如果int64中的数据值不超过int32的表示范围,没问题,如果超出范围就会溢出,不能安全转换。

就是int乘以int默认使用int做的,有可能不够长,所以强制转换。当然这种解释只能是一种常见说法,还需要结合平台,与编译器。这种东西,没有定论的。只有实践才能看到结果。如果实际产品中,显然需要杜绝默认类型转换的发生。

扩展资料:

Int64 为比较此类型的实例、将实例的值转换为它的字符串表示形式以及将数字的字符串表示形式转换为此类型的实例提供了相应的方法。警告在32位Intel 计算机上分配 64 位值不是原子操作;即该操作不是线程安全的。这意味着,如果两个人同时将一个值分配给一个静态 Int64 字段,则该字段的最终值是无法预测的。

参考资料来源:百度百科-int64

参考技术A 1、64位的int转换int32不能单纯的用C的强制类型转换那么简单,要用算法做到的,说白了就是精度降低。这个已经不是转换那么简单了。举个例子吧,32位的真彩色图片,转变为16位的彩色图片,原理是一样的,精度转换降低。

2、比如64位int变成32位int,应该是64位int数值每两个位对应32位int数值的一个位对吧,两个位的值最大为3,所以应该这么做,64位的int数值位0 和位1 如果>=2的话,那么32位int的数值的位0设置为1, 如果<2,则32位int数值的位0设置为0, 一次类推64位int数据的位2和位3,对应32位int数值的位1。
参考技术B

c语言long long(int64)和int(int32)之间如何安全的互相转换要看具体情况。

 

细节如下:

    int32赋值给int64,因为int64的表示范围更大,此时直接赋值,一定安全;

    int64赋值给int32,如果int64中的数据值不超过int32的表示范围,没问题,如果超出范围就会溢出,不能安全转换。

参考技术C 呵呵,我告诉你啊 64位的int转换int32不能单纯的用C的强制类型转换那么简单,要用算法做到的,说白了就是精度降低。这个已经不是转换那么简单了。举个例子吧,32位的真彩色图片,转变为16位的彩色图片,原理是一样的,精度转换降低。

比如64位int变成32位int,应该是64位int数值每两个位对应32位int数值的一个位对吧,两个位的值最大为3,所以应该这么做,64位的int数值位0 和位1 如果>=2的话,那么32位int的数值的位0设置为1, 如果<2,则32位int数值的位0设置为0, 一次类推64位int数据的位2和位3,对应32位int数值的位1.。。。。等等,明白了 这就是降低精度的算法。追问

这是int类型,不是浮点。。。
我想用不着那么麻烦,int64转int32肯定要丢失数据的。
我想的是如果int64正数转int32,直接把int32里面写入32位可以表示的最大正数就可以了。负数同理,直接写入最小的负数了事。
反过来int32转int64则只要符号对就OK了。

如何写语句实现转换?

参考技术D 用if判断每种不同的情况就行了,然后取模就行了追问

能给个详细代码吗?

追答

爪机就不码了,给你思路吧
int32转64,正数时直接赋值,负数转正数赋值后转负数
int64转32同理,正数模2^31后赋值,负数转正后模2^31赋值后转负
望采纳

long long 在c语言中是啥类型

“longlongint”在C语言中是64位长整型数据类型。longlong是属于int型,一般来讲,是longint型大小的两倍,int型的4倍。

“longlongint”在C语言中可以简写为“longlong”,作为“long”和“int”数据类型的强化版数据类型,它能支持的整数范围是-2^63到2^63-1。而先前的“long”是32位长整型数据类型,整数范围仅能支持到-2^31至2^31-1。

“longlongint”和“unsignedlonglongint”都是在C99标准中才被引进的。

扩展资料:

需要注意:

longlong是一个后来加上去的数值类型,也就是说非常老的编译器是不支持这个数据类型的(如VC++6.0)。

C99标准引入的主要新功能:

1、对编译器的限制增加了,比如每行源代码至少需要4095字节,变量和函数名需要63字节(extern最多需要31字节)。

2、添加了新的关键字restrict,inline,_Complex,_Bool。

3、支持longlong、longdouble_Complex、float_Complex等类型。

4、一个不确定长度的数组。数组的长度是一个变量。当你声明一个类型时,你写一个int[*]。但就效率和执行而言,这并不是一种新类型。所以你不能在全局或结构联合中使用它,如果你使用类似的东西,goto语句是受约束的。

5、与C89标准相比,C99引入了一种新的结构/数组初始值设定项,名为指定初始值设定项。

6、支持十六进制浮点数描述。

7、添加了一个内置的本地静态字符数组变量,它可以用于获取当前函数的函数名。

8、函数的默认返回类型是int型。

参考资料来源:百度百科-C99

参考技术A

    long long是属于int型, 一般来讲, 是long int型大小的两倍, int型的4倍.

    但是需要注意的是long long是一个后来加上去的数值类型, 也就是说非常老的编译器是不支持这个数据类型的(如VC++6.0).

    如果在此类编译器下使用长长整型, 以VC++6.0为例, 就要用它的自定义数据类型:__int64. 若要输入输出(包括C++), 则只能用printf或scanf函数. 如:

__int64 i64 = 100;
printf("%l64d", i64);

参考技术B long long 在c语言中是什么类型?“longlongint”在C语言中是64位长整型数据类型。longlong是属于int型,一般来讲,是longint型大小的两倍,int型的4倍。
“longlongint”在C语言中可以简写为“longlong”,作为“long”和“int”数据类型的强化版数据类型,它能支持的整数范围是-2^63到2^63-1。而先前的“long”是32位长整型数据类型,整数范围仅能支持到-2^31至2^31-1。
“longlongint”和“unsignedlonglongint”都是在C99标准中才被引进的。
扩展资料:
需要注意:
longlong是一个后来加上去的数值类型,也就是说非常老的编译器是不支持这个数据类型的(如VC++6.0)。
C99标准引入的主要新功能:
1、对编译器的限制增加了,比如每行源代码至少需要4095字节,变量和函数名需要63字节(extern最多需要31字节)。
2、添加了新的关键字restrict,inline,_Complex,_Bool。
3、支持longlong、longdouble_Complex、float_Complex等类型。
4、一个不确定长度的数组。数组的长度是一个变量。当你声明一个类型时,你写一个int[*]。但就效率和执行而言,这并不是一种新类型。所以你不能在全局或结构联合中使用它,如果你使用类似的东西,goto语句是受约束的。
5、与C89标准相比,C99引入了一种新的结构/数组初始值设定项,名为指定初始值设定项。
6、支持十六进制浮点数描述。
7、添加了一个内置的本地静态字符数组变量,它可以用于获取当前函数的函数名。
8、函数的默认返回类型是int型。
参考技术C long long是C99标准新加的,64位长整形,某些老古董编译器不支持该类型,所以如果要使用的话要注意编译器对C标准的支持,如果不支持可以使用编译器自定义的长整形(如VC的__int64)。 参考技术D long long 类型占64个字节。

符号属性 长度属性 基本型 所占位数 取值范围 输入符举例

[signed] long long [int] 64 -2^63 ~ 2^63-1 %I64d

unsigned long long [int] 64 0 ~ 2^64-1 %I64u、%I64o、%I64x

以上是关于c语言long long(int64)和int(int32)之间如何安全的互相转换?的主要内容,如果未能解决你的问题,请参考以下文章

ACM中关于__int64与long long 的区别

在C/C++里,long long型的范围是多少,输入输出格式是啥?

在C#中long与int64有啥区别吗

32位和64位系统,C语言中char,short,int,long,char*,int*,int**各占多少字节

在C#中long与int64有啥区别吗

C语言中long转换成int是将低位给int吗