西西河

主题:【贴图】最近看的一些令人蛋疼的好图(四) -- 李根

共:💬29 🌺175 新:
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 真好玩!

哈哈.尤其是那个猫图

家园 X86_64上int的gcc还是4 bytes的

long int才是8 bytes,当然,指针都是8 bytes的,虽然实际上也没64位地址用满。我交的这是出于兼容性的考虑,程序猿已经习惯了int是4bytes了,指针用两倍的长度那是没办法。

家园 嗯,是能写下。那只能是为了美观了。

也说不定故意让看到的人去捉摸。

家园 你是对的

sizeof(int)还是4。

不过printf(”%lld“, int_var)在x86_64上不报错,运行结果也正确,让我误以为int和long一样变成8个字节了。

家园 恩,应该是printf自己做了类型转换了
家园 printf()用的是变长参数列表

参数类型及下一个弹出堆栈变量的大小,是在运行时根据格式字符串内容动态决定的。照理printf()应该不会自动转换除格式字符串以外的参数类型。我猜是x86-64上做了优化,究竟是什么样的优化就不清楚了。

家园 问程序员int类型几个字节那个,错了哦。

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改成了别的类型,印象是自己的算法性能下降了近一倍,当时找不到原因,后面高人指点后才明白了上面的道理。

家园 int型长度的讨论

挑点刺.

首先CPU的位数与OS的位数是两个概念.

其次,16位系统上int是16位,32位系统上int是32位,64位主流编译器(如VC,gcc)int仍是32位.

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河