主题:【贴图】最近看的一些令人蛋疼的好图(四) -- 李根
哈哈.尤其是那个猫图
long int才是8 bytes,当然,指针都是8 bytes的,虽然实际上也没64位地址用满。我交的这是出于兼容性的考虑,程序猿已经习惯了int是4bytes了,指针用两倍的长度那是没办法。
sizeof(int)还是4。
不过printf(”%lld“, int_var)在x86_64上不报错,运行结果也正确,让我误以为int和long一样变成8个字节了。
参数类型及下一个弹出堆栈变量的大小,是在运行时根据格式字符串内容动态决定的。照理printf()应该不会自动转换除格式字符串以外的参数类型。我猜是x86-64上做了优化,究竟是什么样的优化就不清楚了。
int这个数据类型是与系统架构有关的,比如说16位机(dos,windows3.2,95)的int类型只有2个字节,但32位机(windows 95,xp,2000)的int类型是4个字节,由于这是目前的主流,所以很多教科书上直接写int是4字节,其实大错特错了,比如说目前的64位机,int类型是8字节,所以在严格的编程实践中,一般不会去用int类型.
觉得应该是参数传给printf之前就被做了类型转换成int了(此处应该是把给定参数的最高位重复以达到占满32bit int型),printf里头应该是直接在高位补0?printf这没跟进去看,因为汇编也忘的差不多了,不过重复了好几遍,结果都是稳定的,应该printf内部从int到long int不是越界读的结果。
gcc 4.2.4 x86_64-linux-gnu
int main () {
/*
int i=1;
int j=(1<<31)+255;
char *c_ip = &j;
printf("int len is %d\n",sizeof(i));
printf("long int len is %d\n",sizeof(j));
printf("int pointer len is %d\n",sizeof(&i));
printf("int is %x\n",j);
printf("long int j is %llx\n",j);
printf("long int char pointer is %llx\n",*c_ip);*/
int a=-1;
printf("long int a is %llx\n",a);
int b=255;
printf("long int b is %llx\n",b);
char c=128;
printf("long int c is %llx\n",c);
char d=127;
printf("long int d is %llx\n",d);
char f=128;
printf("long int f is %llx\n",(int)f);
char g=127;
printf("long int f is %llx\n",(int)g);
printf("long int -1 is %llx\n",(long int)-1);
return 0;
}
output:
long int a is ffffffff
long int b is ff
long int c is ffffff80
long int d is 7f
long int f is ffffff80
long int f is 7f
long int -1 is ffffffffffffffff
首先,在Java,C#等语言中int是固定的4字节。
其次,在C/C++中,以前的确如您所说,int应该是一个机器字的长度,但这个不是C/C++标准规定的,而是一种习惯,而这个习惯在32位转到64位的过程中为了兼容性不再遵守了,现在的VC,GCC,Intel C/C++编译器都把int解释成4字节。但是long int一般会从4字节扩展到8字节。另外就是所有的指针类型长度变为8字节。
平面媒体从业人员表情图那个“改稿后”的表情实在太搞了。
改稿后面目全非,连眼神都不一样。
我面试出题经常出sizeof,然后在不显眼的地方写一下这是8位的机器
其实计算机原理这门课学了,听了,做了作业,这种错误根本不会出现。
在编程时通常用INT32 INT64宏定义来区分,不能直接写int
对int我是这样理解的,它代表当前系统的通用寄存器位数,这意味着,系统对int变量的处理速度是最快的,也就是说,默认的,如果某变量对数据长度不敏感的情况下,如计数变量i,j,k等等,应该都用 int,这样程序的性能是最快的。
我曾经在某款dsp上把int改成了别的类型,印象是自己的算法性能下降了近一倍,当时找不到原因,后面高人指点后才明白了上面的道理。
挑点刺.
首先CPU的位数与OS的位数是两个概念.
其次,16位系统上int是16位,32位系统上int是32位,64位主流编译器(如VC,gcc)int仍是32位.