我试图生成一个从2 ^ 0到2 ^ 63保持2的幂的数组。 我正在使用unsigned long long int。 但是当我打印所有值时,它会打印到2 ^ 30然后它会溢出。 编译器是GNU GCC版本4.8.1。 这是代码。

unsigned long long int a[65],i;

a[0]=1;

for(i=1;i<65;i++) {

a[i]=2<

printf("i=%d a[i]=%lld

",i, a[i]);

}

这是输出

i=1 a[i]=2

i=2 a[i]=4

i=3 a[i]=8

i=4 a[i]=16

i=5 a[i]=32

i=6 a[i]=64

i=7 a[i]=128

i=8 a[i]=256

i=9 a[i]=512

i=10 a[i]=1024

i=11 a[i]=2048

i=12 a[i]=4096

i=13 a[i]=8192

i=14 a[i]=16384

i=15 a[i]=32768

i=16 a[i]=65536

i=17 a[i]=131072

i=18 a[i]=262144

i=19 a[i]=524288

i=20 a[i]=1048576

i=21 a[i]=2097152

i=22 a[i]=4194304

i=23 a[i]=8388608

i=24 a[i]=16777216

i=25 a[i]=33554432

i=26 a[i]=67108864

i=27 a[i]=134217728

i=28 a[i]=268435456

i=29 a[i]=536870912

i=30 a[i]=1073741824

i=31 a[i]=-2147483648

i=32 a[i]=0

i=33 a[i]=2

i=34 a[i]=4

i=35 a[i]=8

i=36 a[i]=16

i=37 a[i]=32

i=38 a[i]=64

i=39 a[i]=128

i=40 a[i]=256

i=41 a[i]=512

i=42 a[i]=1024

i=43 a[i]=2048

i=44 a[i]=4096

i=45 a[i]=8192

i=46 a[i]=16384

i=47 a[i]=32768

i=48 a[i]=65536

i=49 a[i]=131072

i=50 a[i]=262144

i=51 a[i]=524288

i=52 a[i]=1048576

i=53 a[i]=2097152

i=54 a[i]=4194304

i=55 a[i]=8388608

i=56 a[i]=16777216

i=57 a[i]=33554432

i=58 a[i]=67108864

i=59 a[i]=134217728

i=60 a[i]=268435456

i=61 a[i]=536870912

i=62 a[i]=1073741824

i=63 a[i]=-2147483648

i=64 a[i]=0

我也尝试过使用int64_t,但结果是一样的。 如果我通常喜欢这样做的话

unsigned long long int lli = 9223372036854775807;

并且打印它的价值,它正在发挥作用。 我哪里错了?

这可能是有益的。stackoverflow.com/questions/1523483/

您的问题出在以下代码中:a[i] = 2 << (i-1);

假设2类型为int,因为在大多数C ++编译器中它是32位。

您需要覆盖它。

a[i] = 2ULL << (i-1);

您需要特别注意与移位运算符一起使用的类型,移动更多的位,操作数的大小是未定义的行为,这里可能发生任何事情(样本),由于忘记后缀,需要更多的预防措施。

像魅力一样工作。 谢谢!!

其他答案已经回答了您提出的问题,但您的代码中还存在其他一些问题。

要扩展其他答案,请记住,C表达式的类型通常由表达式本身决定,而不是由它出现的上下文决定。你有:

a[i]=2<

赋值左侧的类型unsigned long long int的事实不会影响右侧的评估,类型为int,<

没有必要将数组的元素0视为特殊情况。

而不是2 << (i-1),或更正确2ULL << (i-1),写1ULL << i更直接。

您为变量使用了错误的printf格式字符串。 i的类型为unsigned long long; "%d"需要类型int的参数。但是因为i从0到65计数,所以它也可能是int。 a的元素的类型为unsigned long long int,但您使用的是signed long long int的格式。

这是program strike>代码片段的修改版本,充实到完整的程序并纠正了上述问题:

#include

int main(void) {

unsigned long long int a[65];

int i;

for(i=0;i<65;i++) {

a[i] = 1ULL << i;

printf("i=%d a[i]=%llu

", i, a[i]);

}

}

printf语句只是出于测试目的,在发布之前我正在尝试一些事情,所以我做了很长的int。

@ user1551574:当然,但即使它仅用于测试目的(特别是如果它是用于测试目的),也值得努力使用完全正确的格式字符串。

问题是这一行:

2<

^

2是整数文字,因此结果是int而不是unsigned long long您可以使用ULL后缀来修复此问题。

这也是未定义的行为,使用等于大于提升的左操作数的位长度的移位。在使用printf时,您还有未定义的行为。您使用的格式说明符不正确,在这两种情况下都应使用%llu。

使用正确的警告标志可能会帮助您捕获所有这些错误,例如使用以下标志-fsanitize=undefined -Wall -Wextra -Wconversion -pedantic与clang给出以下警告:

warning: implicit conversion changes signedness: 'int' to 'unsigned long long' [-Wsign-conversion]

a[i]=2<

~~^~~~~~~

warning: format specifies type 'int' but the argument has type 'unsigned long long' [-Wformat]

printf("i=%d a[i]=%lld

",i, a[i]);

~~              ^

%llu

以及以下运行时错误:

runtime error: left shift of 2 by 31 places cannot be represented in type 'int'

c语言long int怎么定义,关于c ++:定义long long int数组相关推荐

  1. C语言试题四十七之程序定义了N×M的二维数组,并在主函数中自动赋值。请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m。

    1. 题目 程序定义了N×M的二维数组,并在主函数中自动赋值.请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m. 2 .温馨提示 C ...

  2. 2020-09-21C++学习笔记之与C语言区别和加强——四种const意义(const int a; int const b; const int *c; int * const d)

    2020-09-21C++学习笔记(const int a; int const b; const int *c; int * const d) 这两天在上课更新晚了. 1.C/C++中的const ...

  3. C语言中的关键字,变量的定义,变量的命名规则,交换两个变量的值,驼峰命名法【 C语言变量名命名法则】

    C语言结构 C语言中的关键字 变量 变量的定义 变量的命名规则 交换两个变量的值 驼峰命名法 C语言结构 上图中我们可以看到最外层是程序,内部是所有的构成,我们从最里面开始说明. 当我们用计算机语言来 ...

  4. c语言 宏定义 去除宏定义_如何检查是否在C中定义了宏?

    c语言 宏定义 去除宏定义 To check whether a Macro is defined or not in C language – we use #ifdef preprocessor ...

  5. c语言一个文件里重复多次定义函数,C语言里的重复定义问题的解决方案

    有时,在使用C语言编码时,会遇到重复定义的错误,那么有什么措施可以避免这种错误呢? 1,公用的符号前加上跟其所在源文件有 关的前缀.比如:所有在 gfx.c 里的函数都加上前缀"gfx_&q ...

  6. int * arr 与 int arr[] 这两种定义数组方式的疑问

    10.26更新!=============================================================== 看了c爹写的书 感觉搞清楚了! int * arr 实际 ...

  7. C语言的艺术之——标识符命令与定义

    好记性不如烂笔头o(^▽^)o 系列的文章: <C语言的艺术之--头文件> <C语言的艺术之--函数> <C语言的艺术之--标识符命令与定义> <C语言的艺术 ...

  8. 【C语言】函数的声明_函数定义_函数调用_函数递归 [函数的基本使用]

    文章目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.2 自定义函数 3.函数的参数 3.1 实际参数(实参): 3.2 形式参数(形参): 4.函数的调用 4.1 传值调用 ...

  9. C语言中的宏函数与宏定义

    目录 1.无参宏定义 1.1 无参数宏定义的格式: 1.2 使用说明: 2.带参宏定义 2.1 带参数宏定义的格式: 2.2 使用说明: 3.带参宏定义与函数调用的区别 4.头文件中常用的宏定义 5. ...

  10. python语言学习:python语言学习中的定义类、定义函数、封装api等详细攻略

    python语言学习:python语言学习中的定义类.定义函数.封装api等详细攻略 目录 python语言学习中的定义类 python语言学习中的定义函数 python语言学习中封装api pyth ...

最新文章

  1. 摄像头ISP系统原理(上)
  2. python中 str 和 repr_python repr()与str()区别总结
  3. java kafka api_kafka java API的使用
  4. ubuntu64位(x86)下科大讯飞sdk使用注意事项
  5. 战神4 幕后花絮 概念艺术_幕后花絮:品牌更新的背后
  6. Python3实现红黑树[下篇]
  7. saltstack中grains简介
  8. 云空间-全面进入免费云时代-国内首家免费T级云空间!
  9. Oracle递归查询,Oracle START WITH……CONNECT BY查询
  10. Mac下遇到的npm install失败问题 err!
  11. 门限电子签名DEMO(协同签名)
  12. 看看这篇ARM体系结构你就都明白了
  13. Chrome如何使用
  14. 振弦传感器不同线制分类
  15. MySQL中表的字段信息查询--information_schema.COLUMNS
  16. 用vue写的移动端车牌号输入法
  17. Mas短信开发增值服务平台建设
  18. Chukeh 小诸葛 .Net 通用类库
  19. elgamal签名算法c语言,ELGamal数字签名.doc
  20. 基于高通骁龙820A的自动驾驶技术实现

热门文章

  1. 服务器数据丢失了如何处理?
  2. seo外链怎么发,seo外链怎么发搜行者SEO
  3. C#将指定picturebox图片保存到本地
  4. android strictmode有什么作用,Android StrictMode运行流程(推荐)
  5. 滴滴旗下小桔车服收购嗨修养车
  6. 如何下载视频号视频?
  7. 蓝桥杯真题 包子凑数 c++代码实现 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 N 种蒸笼,其中第 i种蒸笼恰好能放 Ai个包子。
  8. 地震勘探基础(四)之地震干扰波
  9. Lucene(8_2_0)核心API学习 之 TokenStream(一)
  10. java assert函数_Java Assert 用法简介