i64 和 i128数据类型

一 : 介绍:

int64_t 是 C/C++ 中的一个标准整型数据类型,表示 64 位带符号整数,范围是 -2^63 到 2^63-1。

int128_t 是 C/C++ 中的一个扩展整型数据类型,表示 128 位带符号整数,范围是 -2^127 到 2^127-1。

二 : 用途:

处理极大值的运算,当long long 和 unsigned long long 无法满足运算条件时使用

0 <= i , j ≤ 10 ^ 12

当 i 和 j 运算为 10 ^ 12次加法或者进行乘法时long long 和 unsigned long long 无法满足运算条件

三 : 头文件即使用方式

#include <cstdio>
#include <cstdint>
using namespace std;
using i64 = int64_t;
using i128 = __int128_t;

对于i64

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    i64 A, B;
    cin >> A >> B;
    cout << A * B << endl;
}

可以执行以上操作:

例如输入俩个大数

1234567412418986541 123456789987654321232414214
结果 7988804624435789267

但是对于i128比较特殊

一般编译器不允许输入输出

例如:

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    i128 A, B;
    cin >> A >> B;
    cout << A * B << endl;
}

这样是不被允许的

正确使用为通过函数接受转换i64的数据类型(也可以是字符串)

例如:

i128 ans(i128 ad, i128 hp) 
{
    i128 res = (i128)1 << 120, pre = 0;
    res - ad * hp;
    return res;
}

而主函数部分为

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    i64 ad, hp;
    cin >> ad >> hp;
    ans(ad, hp);
}

当然由于不允许直接输出即使我们用一个i128变量接收ans的返回值也是不允许printf和cout的操作.

四 : 特殊类型i128如何输出 ? 

通常输出是将i28转换为字符串后进行输出例如下列模板

template <typename T> void print(T x)
{
    if (x == 0)  cout << "0";
    else
    {
        string s;
        while (x) 
        {
            s.push_back(char('0' + x % 10));
            x /= 10;
        }
        cout << s;
    }
}

总体实现

#include <cstdio>
#include<string>
#include<algorithm>
#include <cstdint>
#include<iostream>
using namespace std;
using i64 = int64_t;
using i128 = __int128_t;

i128 f(i128 ad, i128 hp) 
{
    i128 res = (i128)1 << 120, pre = 0;
    res - ad * hp;
    return res;
}
template <typename T> void print(T x)
{
    if (x == 0)  cout << "0";
    else
    {
        string s;
        while (x) 
        {
            s.push_back(char('0' + x % 10));
            x /= 10;
        }
        cout << s;
    }
}
int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    i64 ad, hp;
    cin >> ad >> hp;
    print(f(ad, hp));
}
输入1234567412418986541 123456789987654321232414214
计算 1 << 120 - A * B
结果 6754430820607083092785194875997229231

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是24LC64使用I2C的Verilog代码示例: ```verilog module i2c_master( input clk, input rst_n, input sda_i, output reg sda_o, output reg sda_en, output reg scl_o, input sda_ack, output reg sda_out, output reg [7:0] data_out, output reg data_en, output reg [6:0] addr_out, output reg addr_en, output reg rw_out, output reg rw_en, output reg done); // I2C master state machine states parameter IDLE = 3'b000; parameter START = 3'b001; parameter ADDR = 3'b010; parameter DATA_READ = 3'b011; parameter DATA_WRITE = 3'b100; parameter STOP = 3'b101; parameter ERROR = 3'b110; parameter WAIT_ACK = 3'b111; // I2C master state machine signals reg [2:0] i2c_state; reg [7:0] i2c_reg; reg [2:0] i2c_bit_count; reg [6:0] i2c_addr; reg [7:0] i2c_data; reg i2c_rw; // I2C master clock divider parameter DIVIDER = 5000; // 100 kHz // I2C master state machine clock reg [15:0] i2c_clk_count; // Register assignments assign sda_o = i2c_reg[7]; assign scl_o = i2c_reg[6]; assign sda_en = i2c_reg[5]; assign data_en = i2c_reg[4]; assign addr_en = i2c_reg[3]; assign rw_en = i2c_reg[2]; assign done = i2c_reg[1]; assign sda_out = i2c_reg[0]; assign data_out = i2c_data; assign addr_out = i2c_addr; assign rw_out = i2c_rw; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin // Reset i2c master state machine i2c_state <= IDLE; i2c_clk_count <= 0; i2c_reg <= 0; i2c_bit_count <= 0; i2c_addr <= 0; i2c_data <= 0; i2c_rw <= 0; end else begin // I2C master clock generator if (i2c_clk_count < DIVIDER) begin i2c_clk_count <= i2c_clk_count + 1; end else begin i2c_clk_count <= 0; end case (i2c_state) IDLE: begin // Wait for start condition if (!sda_i && scl_o) begin i2c_state <= START; end end START: begin // Send start condition i2c_reg <= {1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0}; i2c_state <= ADDR; end ADDR: begin // Send address case (i2c_bit_count) 0: begin // First bit is always 1 for write, 0 for read i2c_data <= {1'b1, i2c_addr[6:0], 1'b0}; i2c_bit_count <= i2c_bit_count + 1; end 8: begin // Wait for ACK i2c_reg <= {1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0}; i2c_state <= WAIT_ACK; end default: begin // Send next bit of address i2c_data <= i2c_addr[i2c_bit_count-1]; i2c_bit_count <= i2c_bit_count + 1; end endcase end DATA_WRITE: begin // Send data case (i2c_bit_count) 0: begin // Wait for ACK i2c_reg <= {1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0}; i2c_state <= WAIT_ACK; end 8: begin // Send next byte of data i2c_data <= i2c_data >> 8; i2c_bit_count <= 1; end default: begin // Send next bit of data i2c_data <= i2c_data << 1; i2c_bit_count <= i2c_bit_count + 1; end endcase end DATA_READ: begin // Receive data case (i2c_bit_count) 0: begin // Wait for ACK i2c_reg <= {1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0}; i2c_state <= WAIT_ACK; end 8: begin // Read next byte of data i2c_data <= i2c_data << 8; i2c_bit_count <= 1; end default: begin // Read next bit of data i2c_data <= {i2c_data[6:0], sda_i}; i2c_bit_count <= i2c_bit_count + 1; end endcase end WAIT_ACK: begin // Wait for ACK if (sda_ack) begin case (i2c_rw) 0: begin // Write data if (i2c_bit_count == 8) begin i2c_state <= STOP; end else begin i2c_state <= DATA_WRITE; end end 1: begin // Read data if (i2c_bit_count == 8) begin i2c_data <= sda_i; i2c_state <= STOP; end else begin i2c_state <= DATA_READ; end end endcase end else begin // No ACK received i2c_state <= ERROR; end end STOP: begin // Send stop condition i2c_reg <= {1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0}; i2c_state <= IDLE; end ERROR: begin // Error condition i2c_reg <= {1'b1, 1'b1, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b1}; i2c_state <= STOP; end endcase end end endmodule ``` 此代码是一个基本的I2C主机状态机,可以通过控制地址、读/写和数据来与24LC64通信。请注意,这只是一个示例代码,您需要根据您的设计和具体的芯片规格进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值