如何找出在C中存储值(int)所需的字节数

时间:2017-02-21 07:50:29

标签: c bit-shift bitmask

我有一个size_t变量nOffset,其中包含一些我想知道实际需要多少字节来存储它的变量sizeof(size_t)。我猜也可以使用MSB的位置?这是我到目前为止的代码(int nLen = 0; if (nOffset > 0xFFFFFF) { nLen = 4; } else if (nOffset > 0xFFFF) { nLen = 3; } else if (nOffset > 0xFF) { nLen = 2; } else { nLen = 1; } 是4):

 Bson newValue = new Document("_id", true);
   List<Document> collections = collection.find(newValue).into(new ArrayList<Document>());

4 个答案:

答案 0 :(得分:1)

使用循环和预定义常量要容易得多。

将整数除以一个字节的最大值可以表示加一,直到得到零。迭代计数是字节。

以下输出存储整数精度所需的字节数:

size_t a = SIZE_MAX;

size_t bytes = 0;
while( a != 0 )
{
    a /= ( 1u << CHAR_BIT );
    bytes++;
}

答案 1 :(得分:1)

您可以在GCC

中使用以下内置功能
  

- 内置功能:int __builtin_clz (unsigned int x)
       从最高有效位开始,返回X中前导0位的数量。如果X0,则结果未定义。

     

- 内置功能:int __builtin_clzl (unsigned long)
       与__builtin_clz类似,但参数类型为unsigned long

     

- 内置功能:int __builtin_clzll (unsigned long long)
       与__builtin_clz类似,但参数类型为unsigned long long

在找到前导零的数量之后,简单的计算(num_bits = int中的位数 - 前导零)来查找所需的位数。您可以更改为(num_bits + 7) / 8所需的字节数。

答案 2 :(得分:1)

如果您要查找limits.h变量占用的字节数,可以查看INT_MIN库,尤其是INT_MAXpow(2, N)常量,然后可以计算字节数。

如果要查找编码某个整数需要多少字节,

  1. 使用算法,找到等于或大于整数的2 import java.io.*; import java.net.*; import java.security.*; import java.util.Enumeration; import javax.net.ssl.*; public class SSLConnect { public String MakeSSlCall(String meternum) { String message = ""; FileWriter file = null; try { file = new FileWriter("C:\\SSLCERT\\ClientJavalog.txt"); } catch (Exception ee) { message = ee.getMessage(); } //writer = new BufferedWriter(file ); try { file.write("KeyStore Generated\r\n"); KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(new FileInputStream("C:\\SSLCERT\\newclientkeystore"), "client".toCharArray()); file.write("KeyStore Generated\r\n"); Enumeration enumeration = keystore.aliases(); while (enumeration.hasMoreElements()) { String alias = (String) enumeration.nextElement(); file.write("alias name: " + alias + "\r\n"); keystore.getCertificate(alias); file.write(keystore.getCertificate(alias).toString() + "\r\n"); } TrustManagerFactory tmf =TrustManagerFactory.getInstance("SunX509"); tmf.init(keystore); file.write("KeyStore Stored\r\n"); SSLContext context = SSLContext.getInstance("SSL"); TrustManager[] trustManagers = tmf.getTrustManagers(); context.init(null, trustManagers, null); SSLSocketFactory f = context.getSocketFactory(); file.write("About to Connect to Ontech\r\n"); SSLSocket c = (SSLSocket) f.createSocket("192.168.1.16", 4447); file.write("Connection Established to 196.14.30.33 Port: 8462\r\n"); file.write("About to Start Handshake\r\n"); c.startHandshake(); file.write("Handshake Established\r\n"); file.flush(); file.close(); return "Connection Established"; } catch (Exception e) { try { file.write("An Error Occured\r\n"); file.write(e.getMessage() + "\r\n"); file.flush(); file.close(); } catch (Exception eee) { message = eee.getMessage(); } return "Connection Failed"; } } } 的最小幂,N将是最小位数。这很简单,但当整数为负时有一个小的捕获,请参阅https://softwareengineering.stackexchange.com/questions/239036/how-are-negative-signed-values-stored

  2. 或者尝试打印出数字位并计算它们,请参阅C printing bits

答案 3 :(得分:0)

简单地遍历从MSB开始的数据,并用0xFF屏蔽每个字节。要知道哪个字节是MSB portabily,你必须使用位移。

在此代码段中,i是要移位的位数。

size_t i;
for(i=sizeof(data)*8; i!=0; i-=8)
{
  if( (data >> (i-8)) & 0xFF)
  {
    break;
  }
}

size_t bytes_to_copy = i / 8;