五千年(敝帚自珍)

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

共:💬29 🌺175
分页树展主题 · 全看首页 上页
/ 2
下页 末页
    • 家园 这群公知被讽刺的很厉害呀
    • 家园 忍俊不禁,狂笑

      哈哈哈……

    • 家园 int类型那题应该反问

      “您说的是16位机还是32位机”

      • 家园 打个岔,技术一下

        事实上C确实没有规定int该是几字节,好像只规定了不少于几字节。这件事情相当麻烦,因为你不知道自己写的变量会编译成多少位的,够不够用。好在后来主流的编译器有了一定的默契,彼此相差不会太大。

        记得很久以前在绝大多数的编译器上,long和int就一样都是4字节了,而short是2字节,不分16位机还是32位。

        倒是现在64位平台流行以后,又有点搞不清楚了,像x86-64上的gcc,int就是8个字节的。不过这次大家总算有点稻草可捞,赶在世纪末之前制定的C99标准,提供了一个头文件stdint.h,里面定义了一堆诸如int32_t,int64_t之类的玩意,拗口是拗口,到底让程序员有法子说清楚了,自己到底要的是几位。

        顺便说一句,C++最新的标准没出来之前,一直被称作C++0x,意即预计200x年能通过,换言之最迟2009。不过大家显然低估了业界各个大佬扯皮的功力,这个标准一直拖到去年才通过,于是我们就有了C++11……看来有了上回千年虫的教训,计算机界对2012还是比较敬畏滴。

        • 家园 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上做了优化,究竟是什么样的优化就不清楚了。

                • 家园 写了个短看了下

                  觉得应该是参数传给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

    • 家园 花妓者们,花公知们,为他们凉掉的洗脚水干杯~~~
    • 家园 这玩意儿太好看了

      特别是最后两个。

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


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

Copyright © cchere 西西河