2 yhc1991 yhc1991 于 2014.05.17 19:46 提问

用union实现两个int型合并为longlong型

#include
#include
int main(void)
{
union
{
long long i;
// int i;
struct
{
int first;
int second;
}sql_l;
}number;

number.sql_l.first= 1;
number.sql_l.second=2;
printf("%lld\n",number.i);
//printf("%d\n",sizeof(int));
//printf("%d\n",sizeof(long long));
// system("pause");
return 0;

}
./a.out
8589934593
为什么得到的number.i是这个数呢?和合并取得的高位为1,低位为2没什么关系啊,8589934593这个值是怎么的出来的呢?

1个回答

lym753024200
lym753024200   2014.05.17 21:32

有这么几个问题,关键是你的开发环境所致。第一,int数据类型长度,2还是4字节?第二,long long的长度?第三,first和second先后声明后它们分别占据低位和高位还是高位和低位?你把这三个关于环境的问题了解后再分析。

lym753024200
lym753024200 如果问题解决就结贴下吧!
大约 4 年之前 回复
yhc1991
yhc1991 多谢!
大约 4 年之前 回复
lym753024200
lym753024200 这个简单,first=1代表这个低4位字节应该是00000000 00000000 00000000 00000001,同理second=2代表这个高4位字节应该是00000000 00000000 00000000 00000010,于是组合起来的long long就是00000000 00000000 00000000 00000010 00000000 00000000 00000000 00000001,转化成16进制也就是0x0000000200000001,去掉前面7个0就是你的得到答案了,明白了么?
大约 4 年之前 回复
yhc1991
yhc1991 int 数据类型是4字节,long long 的长度为8字节,first和second分别占据的是低位和高位;如果把printf("%lld\n",number.i);这里的%lld改为%llx,会输出200000001,可以看出合并的结果,但是中间这些0位的填充是在怎么得到的呢?
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
两个int类型的数组合并为新的数组
package com.zhidi.zuoye; public class Zuoye03 { public static void main(String[] args) { // 现在给出两个数组: // 数组a:"1,7,9,11,13,15,17,19" // 数组b:"2,4,6,8,10" //      两个数组合并为数组c。 int[] a={1,
把两个short型数组合并到另一个short型数组中
#include "stdafx.h" #include #include #include using namespace std; int NN=6; int main() { short cc[6]; short aa[3]={ 1, 2, 3}; short bb[3]={ 4,5,6 }; short dd[3],ee[3];
C语言四个char型组成int型,和1个int型分成4个char型的方法
四个char型组成int型 int b; char a[4]; a = * (int *) b 1个int型分成4个char型 int b char a[4] * (int *)a = b 还有一种很标准的方法: int i; char *p; p=(char*)&i
int,long,long long类型的数值范围
int ,long ,long long 等各种数据类型的范围
int,char,long,long long,指针字节数。
自行查看。其中指针变量64位系统应该为8个字节。 我是64位系统。 但是显示的4字节,这是因为编译器的问题,编译器需要保证兼容性问题。想要8个字节可以自行设置
关于long long 的输入和输出
关于long long 的输入和输出
怎样打印long long型数
前言:   在16位环境下,int/unsigned int 占16位,long/unsigned long占32位   在32位环境下,int占32位,unsigned int占16位,long/unsigned long占32位 何时需要使用:   long 和 int 范围是[-2^31,2^31-1],即-2147483648~2147483647,而unsigned范围是[0,2
C语言中关于int、long int、long long 的区别
关于i (1)在VC下没有区别。两种类型均用4个字节存放数据。 (2)VC是后出的编译器,之前有很多早期的C编译器,在早期编译器下long int占4个字节,int占2个字节。 (3)之所以有“整型”和“长整形”两种不同类型,是C语言在诞生时发明者规定好的,前者存储的整数的值域小于后者。  这个问题不用牵肠挂肚,在VC下用谁都可以。
C++常见几种输入方法评测(int && long long)
一.概览对于很多的Oier,输入的快慢直接影响到评测的结果,NOI2011道路修建一题的输入量非常的恐怖,于是找了常用的几种输入方式,做一次横向比拼。cin cin(打消iostream的输入输出缓存) scanf getchar()逐个字符读入 fread将文件读入内存,再逐个字符读入 cin (long long) cin(打消iostream的输入输出缓存) (long long) s
【long long与int 的模运算速度比较】
long long MOD 速度 比int慢一半,所以能用int