不用sizeof()求系统int型位数

初识C语言|一维数组的运用之——用sizeof和strlen来打怪? 今天,咱来唠唠一个困扰很多小伙伴儿的问题——“sizeof和strlen在数组中的应用”。首先,让我们来回忆一下sizeof和strlen的概念哈。 阅读详情

腾讯在线笔试的时候遇到了这一题,突然发现自己想到的方法有限,所以把自己想到的和网上给出的一些方法总结起来。

自己想到的方法

  • 利用无符号整型来计算位数,无符号整型的最大值所有位都是1,可以求出所有的位数
int byteOfInt()
{
    unsigned int MAX_INT  = ~0;
    int bits = 0;
    while (MAX_INT) {
        ++bits;
        MAX_INT >>= 1; //也可以这么写MAX_INT = MAX_INT - 1;
    }
    return bits / 8;
}

这里的一个注意事项就是要使用无符号整型,因为如果有符号整型的话第一位是符号位,这就牵扯到包含有符号位的整型值的右移操作,有符号的数字右移是前面填充的是符号位。MSDN这一句话说的比较到位:

* 右移运算符将导致 shift-expression 中的位模式向右移动 additive-expression 所指定的位数。 对于无符号数字,因移位运算而空出的位上将用零填充。 对于有符号数字,符号位用于填充空出的位。 也就是说,如果数字为正,则使用 0;如果数字为负,则使用 1。*
所以最后得到的bits会比实际上的位数少1位

网上的方法

利用整型数组的两个相邻元素的地址之差来确定整型大小

#include <stdio.h>
int main(int argc, char *argv[])
{

        int a[2];
        printf("%x %x\n", &a[0], &a[1]);

        int nbytes;
        nbytes = int(&a[1]) - int(&a[0]);
        printf("%d\n", nbytes);

        int nbytes2;
        nbytes2 = &a[1] - &a[0];
        printf("%d\n", nbytes2);

        return 0;
}

这段代码在我的64位机器上是运行不了了,因为64位机器的指针长度在我的系统下是8字节了,因此需要用long long类型来接收,为了防止不同编译器在不同系统下对这个的限制,所以最好还是使用long long类型来处理:

    int a[2];
    unsigned long long add1 = (unsigned long long)&a[0];
    unsigned long long add2 = (unsigned long long)&a[1];
    printf("%llu", add1);
    printf("%llu", add2);
    return add2 - add1;

下面的宏定义也可以实现相同的效果
c
#define MySizeOf(value) ((char*)(&value+1) - (char*)(&value))

不使用sizeof获取机器int型的字节数 不通过sizeof如何获得int 的字节数呢? 可以利用 左移运算符 这里解释一下左移:就是在二进制的基础上对数字进行平移。左移一次,低位补零,高位舍弃。 比如二进制数 00000001(也就是十进制的1),左移一次变成了00000010(也就是十进制的2) ,同时也就是说,每左移一次,数的值相当于乘以2,当然也就极限。00000001左移8次之后,就变成了00000000。 同时还有右移 阅读详情

相关推荐

将雷达连接到树莓派的串口

dev/ttyAMA0 是树莓派的主要 UART(用于 GPIO 引脚 8 (TXD) 和 10 (RXD))。通常,树莓派使用 GPIO 引脚 8 (TXD) 和 10 (RXD) 进行串口通信。树莓派上通常有两个串口:/dev/ttyS0 和 /dev/ttyAMA0。你需要确认雷达的 TX 和 RX 引脚,并与树莓派的对应引脚连接。VCC(电源)连接到树莓派的 3.3V 或 5V(根据雷达的要求)MR(Receive)连接到树莓派的 GPIO 8 (TXD)GND(地)连接到树莓派的 GND。

qq_45943628的博客 1466

【C++基础编程】#023 如何获得一个整型int的位数

背景 在刷题的过程中,很多时候需要知道一个int整型的位数。 比如判断回文整数等等。 这时可以使用整除10000, 1000, 100这种方法 ,不过比较麻烦。 可以采用将int转换为string类型的字符串,再返回字符串长度即可。 具体方法 利用to_string()函数转化为string类型的字符串; 利用string.size()函数输出字符串长度。 举例说明: #include<iostream> #include<string> using namespace std

杨小浩浩的博客 4604

详解电路设计中的RC电路

​ 一、什么是RC电路 RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用到 的电路。 常见的RC充、放电电路、RC积分电路合RC微分电路接下来详细讲解。 二、RC充、放电电路 RC充、放电电路如下图所示,下面通过充电和放电两个过程来分析此电路。 ​RC充、放电电路图 (1)RC充电电路 RC充电电路图如下图(a)所示 RC充电电路图及充电曲线图 ​由上图分析: 将上图a中开关S置于“1”处,电源E开始通过电阻R对电容C充电,由于刚开始充电时电容两端没有..

IT xiaobai 4万+

计算int型数据的位数

如果要计算一个int类型数据的位数,方法:1、传统的用一个计数变量count,然后循环体中一直number/10,count计数,最后的count就是位数2、直接用log函数,位数count=(int)log10(num)+13、用sprintf和strlen函数,sprintf(str,”%d”,num),count=strlen(str),这种直接求长度效率肯定要低很多,但是直接用了库函数不需要

三个石头 7538

Vue3项目实战:CKEditor5富文本编辑器从安装到隐藏不需要的功能

本文详细介绍了在Vue3项目中集成并深度定制CKEditor5富文本编辑器的完整流程。通过分析其模块化架构,指导开发者从标准构建出发,移除图片、表格等冗余插件,创建专属轻量构建,从而显著减小打包体积并提升用户体验。文章结合实战代码,涵盖了环境搭建、自定义构建配置、高级优化技巧等关键步骤。

weixin_29016833的博客 286

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 215

【PTA】客观题 NO.8

1-1 如果函数定义出现在函数调用之前,可以不必加函数原型声明。 (1分) T F 1-2 局部变量如果没有指定初值,则其初值不确定。 (1分) T F 1-3 在一个函数内部调用另一个函数的调用方式称为嵌套调用。 (1分) T F 1-4 静态变量的作用域是整个文件。 1、 Static类内部变量 二者作用域相同:同auto自动变量(即未加 Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量

Orzient的博客 8791

手把手教你绕过Incapsula reese84防护:从JS反混淆到动态Token生成全流程

本文深入解析了以Incapsula reese84为代表的现代Web客户端挑战防护机制,详细介绍了从JS反混淆、算法逆向到动态Token生成的全流程实战方法。文章系统阐述了如何通过模拟浏览器指纹、移植关键算法或嵌入JS引擎来构建自动化应对策略,并提供了稳健的令牌管理与系统架构设计思路,帮助开发者在合规前提下提升自动化工具的适应性。

jenkins8butler的博客 518

不用 sizeof 判断操作系统是 32 还是 64 位

2018上半年折腾了一回,想换个后台开发岗尝试锻炼一下自己,面了三个部门,将有关有意思的题目汇总记录下来,供大家参考。 解法一: 我们知道,C/C++中,32位系统下编译生成的程序,书写代码时,整形数值默认取值范围是-2^31至2^31-1,加上数值后缀L,表示长整型,取值范围也是-2^31至2^31-1,加上LL表示尝尝整型数值,取值范围是-2^63至2^63-1。64位系统下编译生成的64......

Doublelv 的博客专栏。 3389

QGIS编译(跨平台编译)之五十六:QScintilla编译、QScintilla安装(Windows、Linux、MacOS环境下编译、安装)

QGIS编译;QScintilla编译、QScintilla安装(Windows、Linux、MacOS环境下编译、安装)

LuckyHanMo的博客 1898

【温室气体】GOSAT 数据产品

【温室气体】GOSAT 数据产品

WW、forever的博客 238

C语言int的位数是几位,C中的int总是32位吗?

这与以下问题有关,如何在C中声明32位整数有人提到int在大多数平台上总是32位的。我很好奇这是不是真的。你知道有什么不同尺寸的现代平台吗?忽略具有8位或16位架构的恐龙平台。注意:我已经知道如何从另一个问题中声明32位整数。这个更像是一个调查,找出哪些平台(CPU/OS/编译器)支持其他大小的整数。有现代的8位和16位处理器,只是不在PC环境中。正如一些人所说,不保证"int"是32位的,如果您...

weixin_39915308的博客 4853

【020】C++ 动态内存管理解析:new 和 delete 的正确使用

C++中的动态内存分配是在程序运行时根据需要进行内存空间的分配和释放,与静态内存分配相比,具有更大的灵活性和适应性。动态内存分配可以通过new和delete或者malloc()和free()等函数实现。在程序运行时无法确定所需的内存大小。需要在多个函数之间共享数据,并且数据可能被频繁地创建和销毁。静态数组无法满足需求,例如需要支持可变长度数组。如果在动态分配内存后忘记了释放它,则会导致内存泄漏。为避免内存泄漏,可以使用智能指针或手动管理内存的方式来释放动态分配的内存。

Lion_Long的博客 1470

C语言中的sizeof()和strlen()的区别

C语言中的sizeof()和strlen()的区别 sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别: 1.sizeof()【操作数所占空间的字节数大小】是一种c中的基本运算符。 可以以类型、指针、数组和函数等作为参数。 头文件类型为unsigned int。 运算值在编译的时候就出结果,所以可以用来定义数组维数。 char a[5]="123"; int b=sizeof(a);//b=5 int c=strlen(a);//c=3 sizeof()是一种单目操作符,是用来计算你

zhaocx111222333的博客 5万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

unsafe.sizeof()

描述 // Sizeof takes an expression x of any type and returns the size in bytes // of a hypothetical variable v as if v was declared via var v = x. // The size does not include any memory possibly refere...

记录每一个小阶段的学习心得,持之以恒! 4301

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

int型变量占多少个字节?

引自 http://topic.youkuaiyun.com/t/20010521/10/128376.html int型变量有时候占4个字节(在Win32),有时候占2个字节(在DOS)   这个int类型的大小到底是跟编译器有关,还是跟CPU有关,还是跟操作系统有关? 所谓的16位32位64位系统是由cpu决定的,由机器指令的寻址、寄存器位数决定的   os受cpu的限制,但在32位的cpu下16...

weixin_34401479的博客 3741

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

sizeof(int)为什么输出的是4而不是2呢,int类型究竟占几个字节

以上文章来自:https://blog.youkuaiyun.com/weixin_42339460/article/details/81455103 http://charlesxie.blog.51cto.com/2236179/939680,写得挺好的,总结一下 sizeof(int)为什么输出的是4而不是2呢,int类型究竟占几个字节 最近在看深入理解计算机系统这本书,上面提到了在32位机器和64机器...

weixin_42404595的博客 1万+

Golang中uint、int, int8, int16, int32, int64区别

Golang中uint、int, int8, int16, int32, int64区别 在第一次学习go语言时,对go语言的各种int类型充满疑惑,为什么会有int、int8、int16等等的类型呢?为什么不像java一样,只个int类型呢?直接上demo test.go package main import ( "fmt" "unsafe" ) fun...

离风的博客 4万+

java int型最大是多少_int型的数到底最大值是多少?

本文摘自:http://blog.youkuaiyun.com/friendbaby/article/details/6822690刚才在百度知道上看见一个网友问int型的数最大能存多少。这个问题其实计算机系统结构里有讲解。首先,我们要知道在计算机里怎么存储数字的。在计算机里,对数字编码有3种方式:原码、补码、反码。原码其实就是10进制数直接转2进制数的结果。比如:十进制的18,在二进制里是10010。那这里...

weixin_28756833的博客 3707

2015春季腾讯实习在线测试题之求int型字节长度,不准用sizeof

不使用sizeof,求某机器平台的int型整数位数(16,32,64) 思路,将整数变成字符串处理,并且在内存的末尾填零,即字符串结束符。 如 0x0012,0x00123456,0x00123456789ABCDE分别对应16,32,64位数; 小端机 代码 #include #include int main(int argc , char *argv[]) {      

jinya 987

用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数?(不用sizeof()函数求当前主机上的一个int占用几个字节)

方法一: 16位的系统下, int i = 65536; cout int i = 65535; cout 而32位的系统下: int i = 65536; cout int i = 65535; cout 方法2: int a = ~0;

imgodor的专栏 2193

C语言int 类型的表示范围 sizeof()函数

一 . 在如今32位和64位的计算机系统中,int类型占32位,其中一位为符号位。占32位int的取值范围为-2147483648~2147483647()。 一些类型的输入输出符号: 1.%d有符号10进制整数。 2.%i有符号10进制整数。 3.%o有符号8进制整数。 4.%u无符号10进制整数。 5.%x无符号的16进制数字,并以小写abcdef表示。 6.%X无符号的16进制数字,并以大写ABCDEF表示。 7.%F/%f浮点数。 8.%E/%e用科学表...

qq_52630607的博客 2562

我的第一篇博客:不用sizeof求int的bit数

我的第一篇博客。。 还不会什么高端的东西就来点基础的。 不用sizeof求int的bit数 //不用sizeof求int的bit数 #include<stdio.h> int main(){ unsigned int i = 1; int n = 0; while(i!=0){ i*=2; n++; } printf("%d\n",n); return 0;} 转载于:...

weixin_30267697的博客 61

Golang: int, int8, int16, int32, int64 和 uint 区别

go语言中的 int 的大小是和操作系统位数相关的,如果是32位操作系统,int 类型的大小就是4字节。如果是64位操作系统,int 类型的大小就是8个字节。

dongdongqiang521的博客 4498

sizeof()在不同系统的大小

在64位操作系统中:所有的sizeof()的大小都为 8 在32位操作系统中:所有的sizeof()的大小都为 4

雨小米 825
上一篇: Cocoa Runtime学习笔记
下一篇: C/C++中的struct字节对齐问题
iMinder
博客等级 码龄16年 6粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值